2012-08-22 6 views
4
--deep 또는 --shallow이 모두 제대로 작동 것으로 보인다

역사를 만들 수 있습니다. TFS에서 git-tf checkin --deep을 (현재 비어있는) 새 폴더에 넣으려고하면 오류가 발생합니다. 나는 꽤 많은 역사를 가진 git repo를 가지고있다. 나는 git-tf의 일부로 TFS를 유지/마이그레이션하는 것을 좋아합니다.Git-tf 체크 인 실패 : 커밋 [commitid]에 다수의 부모가 있습니다. --deep 옵션을 사용하면 TFS

나의 이해는 checkin --deep 각 커밋에 대한 TFS에서 유사한 변경 집합을 만들 것입니다. 문제는 git-tf 명령은 매우 불행하게 보인다 어떤 병합의 결과 인 것처럼 보인다 망할 놈의 repo에 커밋 (우리는이 환매 특약의 많은 병합이)이다와 함께 (내가 제목에 나와있는 오류 메시지를보고 [commitid]의 예외는 실제 커밋 ID (예 : 9a26d8)로 대체됩니다. 나는 완전히 여기에 배를 없거나 무엇을하고있어 경우

잘 모르겠어요. TFS에 여러 병합이있는 기존의 git repo를 이식하는 신뢰할 수있는 방법이 있습니까? 나는 이것이 이것이 원시적 인 기능/수정이라고 기대했다. 내가 뭔가를 놓치기를 바란다. 나는 TFS를 아주 좋아하지만 git으로 노련 해지지 않으므로 도움이된다.

답변

16

여기서 문제는 TFS에서 복잡한 병합의 역사를 대표하는 것은 어렵다는 것이다. 간단히 말하면 git 커밋은 여러 개의 부모를 가질 수 있지만 TFS 변경 집합은 하나만 가질 수 있습니다.

내 커밋 시점에서 내 자식 저장소가 HEAD를 가지고 있다고 가정 해 보겠습니다. 예를 들어 9c42ef...입니다. 이제 변경을하고 커밋하여 새로운 커밋 1f23cd...을 만듭니다. 한편, 나는 또한 9c42ef...에 기반한 커밋이었던 Bob의 변경 사항을 적용합니다. 그의 변경 내용은 ID f41ac3...입니다. 두 변경 내용을 통합하려면 병합을 수행해야하며 ID가 7acdfe... 인 커밋으로 끝내야합니다. 단일 변경 집합은 하나의 조상 (. 변경 집합이 직접 이전) 할 수 있기 때문에

  1f23cd 
     /  \ 
9c42ef    7acdfe (HEAD) 
     \  /
      f41ac3 

이 쉽게 TFS에서 표현할 수없는 그래서 우리는 역사를 선형화해야합니다 이제 그래프는 다음과 같습니다. 따라서 --squash--auto-squash 옵션이 git-tf checkin에 있습니다 (깊은 체크인을 수행하는 경우).

--squash 옵션은 역사를 통해 그것의 방법을 작업 할 때 따라야하는 경로를 선택할 수 있습니다. 예를 들어 그래프를 걸을 때

git-tf checkin --deep --squash f41ac3 

f41ac3를 생략하고 세 체인지, 9c42ef, 1f23cd7acdfe의 내용이있을 것이다. 그러나 커다란 그래프에서, 이것은 커밋을 스쿼시로 지정하는 많은 작업입니다. 이 경우 --auto-squash은 따라야 할 경로를 결정할 때 어떤 마법을 사용합니다. (당신은 가능한 가장 역사를 얻고 두 개의 세그먼트는 동일한 길이의 경우, 수행 할 경로를 결정하기 위해 타임 스탬프를 사용할 수 있도록이 커밋의 긴 체인 경로를 선호한다.)

git-tf checkin --deep --auto-squash 

또한 리베이스 수 체크인하고있는 커밋은 선형이었고 각각은 단 하나의 부모만을 가졌습니다.

개발자는 트리의 복잡성, SHA1 해시의 끝이없는 문자열 및 달의 위상 입력에 대한 자폐증적인 느낌에 따라 이러한 전략을 각각 사용합니다.

+0

우수 답변! 감사. 나는 자동 스쿼시에 대해 알아 봤지만, 초기 체크 인을 위해 예비 할 수 있고, 선택적으로 - 앞으로 나아갈 수있다. 다시 한 번 감사드립니다! – EdFred