2014-02-26 6 views
0

커다란 자식 Repo가 있는데이를 2로 분할하고 싶습니다. "git filter-branch"또는 "git subtree split"을 사용하여이 작업을 수행 할 수 있지만 두 방법 모두 있습니다. 완전히 새로운 커밋 ID (SHA)를 생성합니다. 나는 역사를 다시 쓰고 있으며 커밋 ID를 바꿀 것이라는 것을 안다.git split repo하지만 동일한 커밋 ID가 있습니다

하지만 제 요구 사항은 repos를 분할 한 후에도 동일한 커밋 ID를 가져야합니다. 가능한가?

예 : 아래

*foo-bar.git* 1fd3dsg refs #1 change-1 to foo 4sad2as refs #2 change-1 to bar 3edsads refs #3 change-2 to foo 5adsggh refs #4 change-2 to bar 

이제 우리는 foo.git 및 bar.git에 환매 특약 foo는-bar.git 분할 커밋과

는 자식의 repo foo는-bar.git 되세요. 이제 foo.git는 foo에 대한 모든 커밋을 가져오고 bar.git는 bar에 대한 모든 커밋을 가져 오지만 커밋 ID는 변경되었습니다.

내가 가진 무엇 : 내가 기대하고 무엇

*foo.git* 
s43dfsa refs #1 change-1 to foo 
a234s2f refs #3 change-2 to foo 

*bar.git* 
1s3ds3q refs #2 change-1 to bar 
3re2ef2s refs #4 change-2 to bar 

. ID를 커밋 변경

*foo.git* 
1fd3dsg refs #1 change-1 to foo 
3edsads refs #3 change-2 to foo 

*bar.git* 
4sad2as refs #2 change-1 to bar 
5adsggh refs #4 change-2 to bar 

답변

5

은 불가피하다. 이것은 각 커밋, 커밋 메시지 및 상위 커밋 ID의 변경 내용을 기반으로합니다.

단일 커밋을 재정렬 할 때 상위 커밋 ID가 변경되므로 커밋 ID가 동일하게 유지 될 수 없습니다.

+0

네, 수학적으로 불가능합니다 (천문학적으로 불가능할 것 같고 비슷합니다). 그리고 이것이 당신이 원하는 것입니다. Git은 콘텐츠 주소 지정이 가능한 저장 시스템입니다. 즉, 입력 한 콘텐츠가 자체 주소가됩니다. 이것이 git의 모든 것을 신뢰할 수있는 이유입니다. 불가능할뿐만 아니라 ID를 변경할 수 있기 때문에 믿을 수 없을 정도로 견고한 시스템을 완전히 불안정하게 만들 것입니다. 이는 많은 다른 (대부분의) 다른 버젼 사용자의 문제입니다. 여러분이 실제로 컨텐트에 의존하지 않을 수는 없습니다 있을거야. –

+0

@ Sven과 GrayFixler에게 감사드립니다. 나는 그럴 수 없다는 것을 알고있었습니다. 그러나 우리의 실험 실패 중 하나를 해결하기 위해서 이것이 유일한 방법이라는 것을 알았습니다. 그래서 이것을 달성 할 기회가 있다면 탐욕심을 시험해보고 싶었습니다. 해명을 가져 주셔서 감사합니다. – Sridhar