Perforce 사용자를위한 Git


86

저는 수년 동안 Perforce를 사용해 왔습니다. 내 개인 코드에 git을 사용하는 것으로 전환하고 싶지만 내가 본 모든 git 자습서에서는 사용자가 완전한 소스 제어 n00b (엄청나게 지루 해짐)이거나 익숙하다고 가정합니다. svn (나는 아닙니다).

저는 p4를 알고 있으며 분산 소스 제어 시스템의 개념도 이해합니다 (따라서 판매 홍보가 필요하지 않습니다. 감사합니다). 내가 원하는 것은 p4 명령에서 동등한 git 명령으로의 변환 테이블과 p4와 동등한 명령이없는 "ca n't live without"명령입니다.

모든 p4 사용자가 p4의 다른 하위 집합을 사용한다고 생각하기 때문에 내가 본 문서에서 즉시 명확하지 않은 git에서 할 수 있기를 원하는 p4에서 정기적으로 수행하는 작업 중 일부는 다음과 같습니다. :

  1. 단일 클라이언트에서 여러 보류중인 변경 목록을 만듭니다. ( p4 change)
  2. 보류중인 변경 목록을 편집합니다. (또한 p4 change)
  3. 보류중인 모든 변경 목록 ( p4 changes -s pending) 목록보기
  4. 내 클라이언트 ( p4 opened) 또는 보류중인 변경 목록 ( p4 describe) 에서 변경된 모든 파일 목록
  5. (나는 이것에 대한 래퍼 스크립트를 사용하는 용도에 보류중인 변경 목록의 DIFF를 참조 p4 diff하고 p4 describe)
  6. 주어진 파일에 대해 제출 된 변경 목록이 어떤 행에 영향을 미치는지 확인하십시오 ( p4 annotate).
  7. 주어진 파일에 대해 파일에 영향을 준 변경 목록의 설명 목록을 참조하십시오 ( p4 log).
  8. 보류중인 변경 목록 제출 ( p4 submit -c)
  9. 보류중인 변경 목록 중단 ( p4 revert)

이 중 많은 부분이 "변경 목록"을 중심으로 이루어집니다. "changelist"는 p4 용어입니다. git에 해당하는 용어는 무엇입니까?

브랜치가 p4가 changelist라고 부르는 대신 git 사용자가 사용하는 것처럼 들립니다. 약간 혼란 스럽습니다. p4에는 모호하게 관련된 개념 인 것처럼 보이지만 분기라는 것이 있기 때문입니다. (나는 항상 p4의 브랜치 개념이 꽤 이상하다고 생각했지만 브랜치의 고전적인 RCS 개념과는 또 다릅니다.)

어쨌든 ... git의 브랜치로 p4 변경 목록에서 일반적으로 수행하는 작업을 수행하는 방법을 모르겠습니다. p4에서는 다음과 같이 할 수 있습니다.

$ p4 edit a.txt
$ p4 change a.txt
Change 12345 created.

이 시점에서 a.txt가 포함 된 변경 목록이 있습니다. 변경 목록을 제출하지 않고도 설명을 편집하고 계속 작업 할 수 있습니다. 또한 다른 코드 레이어의 버그 수정과 같이 다른 파일을 변경해야하는 경우 동일한 클라이언트에서 수행 할 수 있습니다.

$ p4 edit z.txt
$ p4 change z.txt
Change 12346 created.

이제 동일한 클라이언트에 두 개의 개별 변경 목록이 있습니다. 동시에 작업 할 수 있으며 "전환"하기 위해 아무것도 할 필요가 없습니다. 커밋 할 때가되면 별도로 제출할 수 있습니다.

$ p4 submit -c 12346  # this will submit the changes to z.txt
$ p4 submit -c 12345  # this will submit the changes to a.txt

나는 이것을 git에서 복제하는 방법을 알 수 없습니다. 내 실험 git add에서 현재 분기와 관련된 것으로 보이지 않습니다 . 내가 말할 수있는 한, 내가 어떤 지점에 있었는지에 관계없이 git commit내가 모든 파일을 커밋 git add할 때 :

$ git init
Initialized empty Git repository in /home/laurence/git-playground/.git/
$ ls
a.txt  w.txt  z.txt
$ git add -A .
$ git commit
 Initial commit.
 3 files changed, 3 insertions(+), 0 deletions(-)
 create mode 100644 a.txt
 create mode 100644 w.txt
 create mode 100644 z.txt
$ vi a.txt z.txt 
2 files to edit
$ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   a.txt
#   modified:   z.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
$ git branch aardvark
$ git checkout aardvark
M   a.txt
M   z.txt
Switched to branch 'aardvark'
$ git add a.txt 
$ git checkout master
M   a.txt
M   z.txt
Switched to branch 'master'
$ git branch zebra
$ git checkout zebra
M   a.txt
M   z.txt
Switched to branch 'zebra'
$ git add z.txt 
$ git status
# On branch zebra
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   a.txt
#   modified:   z.txt
#
$ git checkout aardvark
M   a.txt
M   z.txt
Switched to branch 'aardvark'
$ git status
# On branch aardvark
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   a.txt
#   modified:   z.txt

이 예에서 aardvark 및 zebra 분기는 정확히 동일한 변경 세트를 포함하는 것으로 보이며 그 결과에 git status따라 둘 중 하나에서 커밋을 수행하면 동일한 효과가 나타납니다. 내가 뭘 잘못하고 있니?


2
무료 클라이언트 5 개로 충분하다고 가정하면 개인 코드에 perforce를 사용할 수 있습니다.
Logan Capaldo

3
그게 제가 해왔 던 일이지만 오픈 소스이고 오픈 소스 프로젝트에서도 사용되는 것으로 전환하고 싶습니다. 나는 git과 Mercurial을 모두 고려하고 있습니다. 나는 더 많은 추진력을 가지고있는 것 같아서 git쪽으로 기울어왔다.
Laurence Gonsalves

1
처음부터 Git을 배우는 것이 좋습니다. Git에서 규정 한 워크 플로는 Perforce에서 규정 한 워크 플로와 매우 다릅니다. 번역 된 워크 플로는 어색하고 기능을 동일시하려고하면 이해가 혼란스러워집니다. 다행히 Git 커뮤니티는 초보자를위한 풍부한 문서를 제공합니다. git-scm.com/book
Colonel Panic

1
@ColonelPanic 나는 당신의 요점을 볼 수 있지만 그러한 문서의 문제는 모든 Perforce 사용자가 이미 알고있는 기본적인 것들을 설명하는 데 시간을 낭비한다는 것입니다. 이러한 문서를 읽는 것은 변수가 무엇인지 설명하는 장을 쓰는 다른 프로그래밍 언어에 대한 자습서를 읽으려는 것만 큼 성가신 일입니다.
Laurence Gonsalves 2013 년

@ColonelPanic 즉, 실제로 매우 유용한 Git From the Bottom UpGit for Computer Scientists 를 포함하여 다른 git 문서를 읽었 습니다 . 나는 몇 년 동안 Git을 사용해 왔으며 (이 질문이 처음 질문되었을 때 참고) git 학습의 주요 문제는 문서 부족이 아니라 잘못된 명명법, 내부 불일치, 심하게 과부하 된 명령 및 특정 실제로 사용할 준비가되지 않은 미완성 부품. 나는 누군가가 가서 모든 찌꺼기를 정리하기를 바랍니다. 그러나 그것은 그것에 익숙해 진 사람들을 짜증나게 할 것입니다.
Laurence Gonsalves 2013 년

답변:


72

나는 perforce를 많이 사용하지 않았기 때문에 이것이 정확히 1 : 1 번역이 아닐 수도 있습니다. 그런 다음 git 및 mercurial과 같은 분산 소스 제어 시스템은 어쨌든 다른 작업 흐름을 가지므로 실제로 1 : 1 번역이 없습니다 (그리고 없어야합니다). 어쨌든, 여기에 간다 :

  • 여러 보류 변경 목록 만들기-> 대신 분기를 사용하십시오. git 브랜치는 가볍고 빠르며 생성하는 데 1 초도 걸리지 않으며 일반적으로 병합하는 데 2 ​​초도 걸리지 않습니다. 자주 분기하고 리베이스하는 것을 두려워하지 마십시오.

    git branch new-branch-name
    git checkout new-branch-name
    

    또는 한 줄로 모두 수행하십시오.

    git checkout -b new-branch-name
    
  • 보류중인 모든 변경 목록 목록보기-> 여러 보류중인 변경 목록에 해당하는 것은 여러 분기이므로 분기를보기 만하면됩니다.

    git branch
    

    원격 지점도 보려면 다음을 수행하십시오.

    git branch -a
    

    병합에 성공한 후 즉시 브랜치를 삭제하는 것이 좋습니다. 따라서 병합 대기중인 브랜치와 이미 병합 된 브랜치를 추적 할 필요가 없습니다.

  • 모든 변경된 파일 나열-> 특정 분기에서 보류중인 단일 "변경 목록"에 대해 git에는 인덱스 또는 캐시의 개념이 있습니다. 변경 사항을 커밋하려면 먼저이 인덱스에 파일을 추가해야합니다. 이를 통해 단일 변경을 나타내는 파일 그룹을 수동으로 선택하거나 관련없는 파일을 무시할 수 있습니다. 이 색인에 추가 된 파일의 상태를 보려면 다음을 수행하십시오.

    git status
    
  • 보류중인 변경 목록의 차이점을 참조하십시오.-> 여기에는 두 부분이 있습니다. 먼저 작업 디렉토리와 색인 간의 차이점을 확인하십시오.

    git diff
    

    그러나 지금 입력하고있는 내용과 마지막 커밋 사이의 차이를 알고 싶다면 작업 디렉토리 + 인덱스와 HEAD 사이의 차이를 요청하는 것입니다.

    git diff HEAD
    
  • 주어진 파일에 대해 제출 된 변경 목록이 어떤 행에 영향을 미치는지 확인하십시오.-> 이것은 쉽습니다.

    git blame filename
    

    또는 더 나은 경우, 창 환경에있는 경우 :

    git gui blame filename
    

    Git gui는 파일을 구문 분석하는 데 더 오래 걸리지 만 (C 대신 tcl로 작성 됨) 커밋 ID를 클릭하여 과거로 "시간 여행"하는 기능을 포함하여 많은 깔끔한 기능이 있습니다. 나는 그들이 미래로의 "시간 여행"기능을 구현하여 주어진 버그가 마침내 어떻게 해결 될지 알 수 있기를 바랍니다 ;-)

  • 주어진 파일에 대해 파일에 영향을 준 변경 목록에 대한 설명 목록을 참조하십시오.

    git log filename
    

    그러나 git log는 이것보다 훨씬 더 강력한 도구입니다. 실제로 대부분의 개인 스크립트는 저장소를 읽기 위해 git 로그에서 피기 백됩니다. 맨 페이지를 읽으십시오.

  • 보류중인 변경 목록 제출-> 또한 쉽습니다.

    git commit
    

내 일반적인 git 워크 플로를 보려면 이전 질문에 대한 답변을 참조하십시오 : Learning Git. 내가 올바른 길을 가고 있는지 알아야합니다.

내가 설명한 워크 플로를 따르면 gitk와 같은 도구가 변경 그룹을 명확하게 볼 수 있기 때문에 훨씬 더 가치있는 도구를 찾을 수 있습니다.


추가 답변 :

Git은 매우 유연하며 설명하는 작업을 수행하는 여러 가지 방법이 있습니다. 기억해야 할 점은 작업중인 각 기능에 대해 항상 새 분기를 시작하는 것입니다. 즉, 마스터 브랜치는 건드리지 않으므로 언제든지 다시 돌아와 버그 수정을 수행 할 수 있습니다. git one에서 작업하는 것은 거의 항상 다음으로 시작해야합니다.

git checkout -b new-feature-a

이제 a.txt 파일을 편집 할 수 있습니다. 다른 기능에 대해 동시에 작업하려면 다음을 수행하십시오.

git checkout master
git checkout -b new-feature-z

이제 z.txt 파일을 편집 할 수 있습니다. a.txt로 다시 전환하려면 :

git checkout new-feature-a

그러나 잠깐, new-feature-z에 대한 변경 사항이 있으며 git에서는 분기를 전환 할 수 없습니다. 이 시점에서 두 가지 선택이 있습니다. 첫 번째는 가장 간단한 방법으로 모든 변경 사항을 현재 분기에 커밋합니다.

git add .
git commit
git checkout new-feature-a

이것이 제가 권장하는 것입니다. 그러나 실제로 코드를 커밋 할 준비가되지 않은 경우 일시적으로 숨길 수 있습니다.

git stash

이제 분기 new-feature-a로 전환 할 수 있습니다. 작업 중이던 코드로 돌아가려면 숨김을 팝니다.

git checkout new-feature-z
git stash pop

모두 완료되면 모든 변경 사항을 마스터로 다시 병합하십시오.

git merge --no-ff new-feature-a
git merge --no-ff new-feature-z

병합은 매우 빠르고 쉽기 때문에 (충돌이 매우 드물고 충돌 해결이 쉽기 때문에 발생하는 경우 너무 어렵지 않음) 모든 작업에 git에서 분기를 사용합니다.

다음은 다른 소스 제어 도구에서 볼 수없는 git에서 브랜치를 일반적으로 사용하는 또 다른 예입니다 (아마도 수은 제외).

개발 환경을 반영하기 위해 구성 파일을 계속 변경해야합니까? 그런 다음 분기를 사용하십시오.

git checkout -b dev-config

이제 선호하는 편집기에서 구성 파일을 편집 한 다음 변경 사항을 커밋합니다.

git add .
git commit

이제 모든 새 브랜치는 마스터가 아닌 dev-config 브랜치에서 시작할 수 있습니다.

git checkout dev-config
git checkout -b new-feature-branch

완료되면 대화 형 rebase를 사용하여 new-feature-branch에서 dev-config의 편집 내용을 제거합니다.

git rebase -i master

원하지 않는 커밋을 삭제 한 다음 저장하십시오. 이제 사용자 지정 구성 편집없이 깨끗한 분기가 있습니다. 마스터로 다시 병합 할 시간 :

git checkout master
git merge --no-ff new-feature-branch
# because master have changed, it's a good idea to rebase dev-config:
git checkout dev-config
git rebase master

git rebase -i모든 변경 사항이 동일한 파일에서 발생하는 경우에도 편집 내용을 제거 하면 작동합니다. Git은 파일 내용이 아닌 변경 사항을 기억합니다 *.

* 참고 : 실제로 기술적으로 완전히 사실은 아니지만 사용자로서의 느낌입니다.


추가 답변 :

따라서 의견을 보면 결합 된 코드가 어떻게 작동하는지 테스트 할 수 있도록 두 개의 분기가 동시에 존재하기를 원하는 것 같습니다. 음, 이것은 브랜치의 힘과 유연성을 보여주는 좋은 방법입니다.

첫째, 저렴한 분기 및 수정 가능한 기록이 워크 플로에 미치는 영향에 대한 단어입니다. CVS와 SVN을 사용할 때 저는 항상 커밋하기를 조금 꺼 렸습니다. 불안정한 코드를 커밋하면 필연적으로 다른 사람의 작업 코드를 망칠 수 있기 때문입니다. 그러나 git와 함께 나는 그 두려움을 잃었습니다. git에서는 내가 마스터로 병합 할 때까지 다른 사람들이 내 변경 사항을 얻지 못하기 때문입니다. 그래서 지금은 제가 작성하는 5 줄마다 코드를 커밋하고 있습니다. 커밋하기 위해 완벽한 예지력이 필요하지 않습니다. 사고 방식을 바꾸면됩니다 : commit-to-branch == add-to-changeset, merge-to-master == commit-changeset.

다시 예를 들어 보겠습니다. 내가 할 방법은 다음과 같습니다. 브랜치가 new-feature-z있고 new-feature-a. 나는 그것을 테스트하기 위해 새 분기를 만들 것입니다.

# assume we are currently in branch new-feature-z
# branch off this branch for testing
git checkout -b feature-z-and-feature-a
# now temporarily merge new-feature-a
git merge --no-ff new-feature-a

이제 테스트 할 수 있습니다. feature-z가 feature-a와 함께 작동하도록 수정해야하는 경우 그렇게하십시오. 그렇다면 관련 분기에 대한 변경 사항을 다시 병합 할 수 있습니다. git rebase -i병합에서 관련없는 변경 사항을 제거하는 데 사용 합니다.

또는 git rebase를 사용하여 new-feature-z의 기반을 일시적으로 변경하여 new-feature-a를 가리킬 수도 있습니다.

# assume we are currently in branch new-feature-z
git rebase new-feature-a

이제 분기 기록이 수정되어 new-feature-z가 master 대신 new-feature-a를 기반으로합니다. 이제 테스트 할 수 있습니다. 이 분기에서 커밋 된 모든 변경 사항은 new-feature-z 분기에 속합니다. new-feature-a를 수정해야하는 경우 새 변경 사항을 가져 오기 위해 다시 전환하고 rebase합니다.

git checkout new-feature-a
# edit code, add, commit etc..
git checkout new-feature-z
git rebase new-feature-a
# now new-feature-z will contain new changes from new-feature-a

완료되면 마스터로 다시 돌아가서 new-feature-a에서 변경 사항을 제거하십시오.

# assume we are currently in branch new-feature-z
git rebase master

새로운 지점을 시작하는 것을 두려워하지 마십시오. 일회용 가지를 시작하는 것을 두려워하지 마십시오. 가지를 버리는 것을 두려워하지 마십시오. 그리고 merge == submit 및 commit == add-to-changeset이므로 자주 커밋하는 것을 두려워하지 마십시오. 커밋은 개발자의 궁극적 인 실행 취소 도구입니다.

아, 그리고 또 다른 것은 git에서 삭제 된 분기가 여전히 저장소에 존재합니다. 따라서 나중에 유용하다는 사실을 실수로 삭제 한 경우 기록을 검색하여 언제든지 다시 가져올 수 있습니다. 그러니 가지를 버리는 것을 두려워하지 마십시오.


1
각 분기에 자체 "색인"이 있습니까? 아니면 분기간에 공유되는 단일 색인이 있습니까? 내 실험은 후자를 제안하는 것 같지만 "특정 분기 git에는 인덱스 또는 캐시의 개념이 있습니다"라고 말하면서 전자를 제안합니다.
Laurence Gonsalves

4
다른 도구입니다. 다른 작업 흐름과 다른 사고 방식과 습관이 필요합니다. 설명하는 방식으로 작동하지 않는 자식은 없습니다. 그것은 가지이고 다른 것은 없습니다. 그러나 매우 강력한 분기 조작 도구가 있습니다. 소스 제어에 대해 전혀 모르는 초보자라고 생각하고 기본 튜토리얼을 읽는 것이 좋습니다. git-land에서 재교육을 받아야하는 현재의 사고 방식 "나쁜 습관"을 고려하십시오. 죄송합니다 ..
slebetman

1
따라서 동시에 작업하고 싶은 두 가지 작업이있는 경우 (그리고 같은 장소에서 서로에 대해 커밋되지 않은 변경 사항을 테스트 할 수 있도록) git에서 무엇을하나요? 또한 커밋을 수행하기 전에 커밋 메시지를 어떻게 편집 할 수 있습니까? 워크 플로가 다르다는 점은 인정할 수 있지만 git에 해당하는 워크 플로가 무엇인지 말하지 않으 셨습니다. 이것이 나쁜 습관이라고 말하는 것은 버그를 기능으로 전달하려는 것과 같은 끔찍하게 들립니다.
Laurence Gonsalves

2
업데이트 된 답변을 읽으십시오. 병합되지 않은 분기에 대해 생각해야 할 때 커밋되지 않은 변경 측면에서 여전히 생각하고 있습니다.
slebetman

2
매우 광범위한 답변입니다. 이것은 어느 시점에서 위키 화되어야합니까?
Tim Clemons

1

나는 실제 치트 시트를 만들기에 충분한 p4 경험이 없지만 적어도 몇 가지 유사점을 되돌릴 수 있습니다. p4 "changeset"은 git "commit"입니다.

로컬 작업 공간에 대한 변경 사항은로 "인덱스"에 추가되고 git add나중에 인덱스는로 커밋됩니다 git commit. 따라서 색인은 모든 의도와 목적을 위해 보류중인 변경 목록입니다.

당신의 변경 사항을보고 git diff하고 git status, 어디 git diff보통 작업 공간 인덱스 사이의 변화를 나타낸다하지만, git diff --cached인덱스 및 저장소 (= 보류중인 변경 목록) 사이의 변화를 나타낸다.

더 자세한 정보는 http://progit.org/book/을 추천 합니다. 일반적으로 버전 제어를 알고 있으므로 많은 부분을 훑어보고 git 특정 정보를 추출 할 수 있습니다.


1
"p4 체인지 셋은 자식 커밋"이라는 데 동의하지 않습니다. 그것들은 사실과 가장 비슷하지만 p4 체인지 셋은 git 커밋 세트에 훨씬 더 가깝습니다. p4 체인지 셋은 기능을 나타내는 반면 git 브랜치는 기능을 나타냅니다.
RJFalconer

@RJFalconer 음. "지점"도 Perforce의 지점입니다. 그리고 "changeset"은 커밋과 매우 흡사 한 하나 이상의 파일에 대한 원자 적 변경 모음입니다. 그렇지 않다면 p4가 커밋과 동등하다고 말하겠습니까?
Jakob Borg

나는 p4는 원자 성의 정도가 같지 않기 때문에 동등한 것이 없다고 말할 것입니다. git에서는 주어진 파일에서 몇 가지 변경 사항을 적용한 다음 다른 커밋 (git add -p)에서 커밋하여 기능 / 버그 수정에서 기록의 리팩토링 / 정리를 분리 할 수 ​​있습니다. p4에서이 작업을 수행하려면 두 가지를 별도로 개발해야합니다. 그럼에도 불구하고 다른 개발자가 그들 사이에 제출할 수 있기 때문에 내 커밋은 연속적이지 않을 수 있습니다 (디스크에서 자주 비실용적 인 복제를 포함하는 개인 브랜치가 아닌 경우).
RJFalconer

면책 조항 : 저는 몇 달 동안 만 p4를 사용했으며 아직 보지 못한이 작업을 수행하는 기능이있을 가능성이 높습니다.
RJFalconer

p4 변경 목록 및 p4 분기는 논리적으로 git 커밋 및 git 분기와 동일합니다. p4 shelve는 git stash와 동일합니다. 그것들이 다른 부분은 구현 (즉, 분산 된 서버와 클라이언트-서버)에 있고 그 차이는 여러 단계와 상당한 시간을 포함하는 git checkout에 해당하는 p4가됩니다. 오버 헤드는 여러 분기가 일반적으로 git checkout과 동일한 작업을 수행하는 대신 디스크에 로컬로 보존되는 것과 같습니다. p4 선반은 로컬 저장소가 아니라 서버에 저장됩니다.
조쉬 Heitzman

1

나는 당신처럼 git 브랜치와 정확히 같지 않은 "changelist"개념의 부족으로 고통받습니다.

해당 변경 목록의 파일 목록으로 변경 목록 파일을 만드는 작은 스크립트를 작성합니다.

git commit -a @ change_list_contents.txt를 호출 한 다음 "git commit"을 호출하여 특정 변경 목록 만 제출하는 또 다른 명령

도움이되는 희망, Elias


예, 저는 실제로 이와 같은 작업을 고려했습니다. 당시이 질문을했을 때 저는 git을 처음 접했기 때문에 "네이티브"솔루션을 알고 싶었습니다. 이제 내가 놓친 가장 중요한 것은 실제로 커밋하지 않고 커밋 메시지에 대해 작업 할 수 있다는 것입니다. 따라서 "보류중인 커밋 메시지"를 보유 할 파일과 커밋 메시지를 작성할 때 자동으로 읽는 마술을 통해 해결할 수 있습니다.
Laurence Gonsalves 2012

@LaurenceGonsalves, 내가 사용하는 워크 플로는 작업에 집중하는 동안 불완전한 커밋 메시지 (또는 "WIP")를 커밋 한 다음 나중에 리베이스 중에 수정하는 것입니다. 커밋은 순전히 로컬이기 때문에 브랜치를 사용 가능하게 만들 때까지 (리모컨으로 푸시하거나 이와 유사한 방식으로) 최종일 필요가 없습니다.
RJFalconer

1

워크 플로의 일부를 구성 할 수있는 더 가벼운 대안이 git에 있습니다. git 스테이징 영역을 사용합니다.

나는 종종 변경 한 다음 여러 커밋으로 제출합니다 (예 : 디버그 문 추가, 리팩터링, 실제로 버그 수정). perforce 변경 목록을 설정하고 변경 한 다음 제출하는 대신 변경 한 다음 제출 방법을 선택할 수 있습니다 (선택적으로 git 스테이징 영역 사용).

다음을 사용하여 명령 줄에서 특정 파일을 커밋 할 수 있습니다.

git commit a.txt
git commit z.txt

또는 먼저 파일을 명시 적으로 준비합니다.

git add a.txt
git commit
git add z.txt
git commit

git gui를 사용하면 파일 내에서 줄 또는 덩어리를 선택하여 스테이징 영역에서 커밋을 작성할 수 있습니다. 이것은 하나의 파일에서 다른 커밋으로 변경하려는 경우 매우 유용합니다. git에서 perforce로 옮긴 것은 내가 정말로 놓친 것입니다.

이 워크 플로에 대해 염두에 두어야 할 작은주의 사항이 있습니다. 파일 A와 B를 변경하고 파일을 테스트 한 다음 A를 커밋하면 해당 커밋을 B와 독립적으로 테스트하지 않은 것입니다.


git을 사용하면 perforce (예 : 줄과 덩어리)보다 더 세밀한 커밋을 수행 할 수 있다는 것은 확실히 사실입니다. 내가 (여전히) perforce에서 놓친 것은 내가 현재 작업하고있는 것에 대한 변경 설명 (일명 커밋 메시지)을 추적 할 수있는 능력입니다. 예를 들어, 버그 # 12345를 고치려고 할 때 내가하고 있다고 말하는 변경 목록을 생성합니다 (하지만 제출하지 않음). 그런 다음 작업하면서 변경 설명을 업데이트하여 수행 한 작업을 표시했습니다. 마지막으로 완료되면 변경 목록을 커밋합니다.
Laurence Gonsalves

git에서 대략적으로 동등한 것은 그 작은 (종종 작동하지 않는) 비트를 dev 브랜치에 커밋 한 다음 모든 것이 정상이면 변경 사항을 병합하는 것입니다. 이것은 여전히 ​​나에게 훨씬 더 지루하고 투박한 느낌입니다. 또한 컴파일도하지 않는 코드를 커밋한다는 생각에 아직 익숙하지 않았습니다.
Laurence Gonsalves

@LaurenceGonsalves 그동안 익숙해지면 궁금합니다. 나는 Git에서 Perforce로오고 있는데 15 분마다 커밋 할 수있는 것을 놓친 다음 준비가되면 푸시합니다.
damian

0

이것은 귀하의 질문에 구체적으로 대답하지 않지만 2 사용자, 5 작업 공간 버전의 perforce가 perforce 웹 사이트 에서 무료로 다운로드하여 사용할 수 있다는 것을 알고 있는지 모르겠습니다 .

이렇게하면 원하는 경우 개인 프로젝트에 집에서 perforce를 사용할 수 있습니다. 한 가지 성가신 점은 약간 제한적일 수있는 5 개의 작업 공간이지만 가정용으로 사용할 수있는 perforce가 있다는 것은 꽤 놀랍습니다.


2
그게 제가 해왔 던 일이지만 오픈 소스이고 오픈 소스 프로젝트에서도 사용되는 것으로 전환하고 싶습니다.
Laurence Gonsalves

0

Perforce와 git을 상당히 광범위하게 사용했기 때문에 git을 사용하여 Perforce 변경 목록에 접근 할 수있는 방법은 한 가지뿐입니다.

가장 먼저 이해해야 할 점은 git에서이 기능을 완전한 클루지가 아닌 방식으로 올바르게 구현하는 것입니다. .

Perforce 변경 목록은 단순히 git에 해당하지 않는 워크 플로를 허용합니다. 다음 워크 플로우를 고려하십시오.

Check out a branch
Modify file A and add it to changelist 1
Modify file B and add it to changelist 2

당신은 당신이 파일에 대한 변경 사항을 가지고 그 중 하나는 두 가지로 바람거야 자식이 사용하는 가지를 수행하려고 할 경우 A, 다른 파일에 대한 변경 사항을 가지고 B있지만, 두 파일의 변경 볼 수있는 장소가 AB시를 동시.

내가 볼 수있는 가장 가까운 근사치는 전체 파일을 선택하거나 거부 git add . -p하기 위해 'a''d'하위 명령을 사용한 다음 사용하는 것 입니다. 그러나 그것은 완전히 동일하지 않으며 여기서 차이점은 두 시스템의 일반적인 작동 방식의 근본적인 차이에서 비롯됩니다.

Git (그리고이 토론에서는 중요하지 않은 Subversion)을 사용하면 누구에게도 미리 알리지 않고 파일을 변경할 수 있습니다. 파일을 변경 한 다음 변경 사항을 커밋 할 때 git이 모두 정렬하도록합니다. Perforce에서는 변경이 허용되기 전에 파일을 적극적으로 체크 아웃해야하므로 변경 목록이 존재해야합니다. 본질적으로 Perforce에서는 파일을 변경하기 전에 색인에 파일을 추가해야합니다. 따라서 Perforce에서 여러 변경 목록이 필요하고 git에 동등한 항목이없는 이유도 있습니다. 단순히 그것들이 필요하지 않습니다.


0

Git 2.27 (2020 년 2 분기)에서 " git p4"는 4 개의 새로운 후크와 --no-verify이를 우회하는 " "옵션 (및 기존 " p4-pre-submit"후크)을 배웠습니다 .

참조 1ec4a0a 커밋 , 38ecf75 커밋 , cd1e0dc 커밋 (2020 2월 14일을), 및 4935c45 커밋 , aa8b766 커밋 , 9f59ca4 커밋 , 6b602a2 커밋 에 의해 (2020년 2월 11일) 벤 킨을 ( seraphire) .
(Merged by Junio ​​C gitsterHamano -- in commit 5f2ec21 , 22 Apr 2020)

git-p4: p4 제출 후크 추가

서명자 : Ben Keene

git 명령 " commit"은 commit 명령의 동작 변경을 지원하는 여러 후크를 지원합니다.

git-p4.py프로그램은 "하나 개의 기존 후크가 있습니다 p4-pre-submit."

이 명령은 프로세스 초기에 발생합니다.

P4 변경 목록 텍스트를 프로그래밍 방식으로 수정하기위한 프로세스 흐름에는 후크가 없습니다.

git-p4.py제출 옵션에 3 개의 새로운 후크를 추가합니다 .

새로운 후크는 다음과 같습니다.

  • p4-prepare-changelist-변경 목록 파일이 생성 된 후이 후크를 실행합니다. 옵션이 설정되어
    있어도 후크가 실행 --prepare-p4-only됩니다.
    이 후크는의 --no-verify기존 동작을 유지하기 위해 옵션을 무시합니다 git commit.

  • p4-changelist-사용자가 변경 목록을 편집 한 후이 후크를 실행합니다.
    사용자가 --prepare-p4-only옵션 을 선택한 경우이 후크를 실행하지 마십시오 .
    이 후크는 --no-verify의 규칙에 따라 git commit.

  • p4-post-changelist-P4 제출 프로세스가 성공적으로 완료된 후이 후크를 실행합니다.
    이 후크는 매개 변수를 취하지 않으며 --no-verify옵션에 관계없이 실행 됩니다.

반환 값은 확인되지 않습니다.

새 후크에 대한 호출 : p4-prepare-changelist,, p4-changelistp4-post-changelist모두 try-finally 블록 내에서 호출되어야합니다.


Git 2.28 (2020 년 3 분기) 이전에는 " --prepare-p4-only"옵션이 하나의 변경 집합을 재생 한 후 중지되어야하지만 계속 진행되었습니다 (실수로?)

Ben Keene ( )의 commit 2dfdd70 (2020 년 5 월 12 일)을 참조하세요 . (Merged by Junio ​​C Hamano -- in commit 7a8fec9 , 02 Jun 2020)seraphire
gitster

git-p4.py: --prepare-p4-only여러 커밋으로 오류 수정

서명자 : Ben Keene

옵션 git p4 submit과 함께 사용할 때 --prepare-p4-only프로그램은 단일 p4 변경 목록을 준비하고 사용자에게 더 많은 커밋이 보류 중임을 알리고 처리를 중지해야합니다.

p4-changelist후크 기능으로 인해 프로그램이 보류중인 모든 변경 목록을 동시에 계속 처리하도록 하는 버그가 발생했습니다.

커밋 적용이 성공하고 프로그램이 계속되어야 할 때 함수가 applyCommit반환 True됩니다.
그러나 옵션 플래그 --prepare-p4-only가 설정되면 프로그램은 첫 번째 적용 후 중지되어야합니다.

메소드를 --prepare-p4-only성공적으로 완료 한 후 플래그를 확인하도록 P4Submit에 대한 실행 메소드의 로직을 변경하십시오 applyCommit.

둘 이상의 커밋이 P4에 제출을 보류중인 경우 메서드는 P4 변경 목록을 올바르게 준비하지만 종료 코드 1로 응용 프로그램을 종료합니다.

현재 문서는 종료 코드가이 조건에 있어야 무엇을 정의하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.