2016-10-23 6 views
2

(현재 게시하기 전에 기존 저장소를 수정하고 있습니다.)서브 모듈에 대한 참조를 보존하는 서브 모듈을 리베이스하는 방법 서브 모듈을 포함하는 자식 저장소에서 커밋을 커밋 하시겠습니까?

이미 알고있는 방법은 rewrite commit author e-mail and name in git history입니다.

서브 모듈이있는 자식 프로젝트가 있습니다. 나는이 서브 모듈의 역사를 다시 쓰고 싶지만, 개발 중에이 서브 모듈을 빨리 감기 때문에 하위 모듈 rebase 후에 새로운 서브 루틴을 가리키는 링크에이 서브 모듈 커밋 중 일부를 가리키는 링크를 수정하려고한다. 나는. 이 서브 모듈을 포함하는 저장소를 리베이스하는 것과 함께 자식 서브 모듈을 리베이스해야합니다. 죄송합니다. 너무 긴 텍스트에 대해서는 그 길이를 짧게 설명하는 방법을 모르겠습니다.

서브 모듈을 포함하는 git 저장소 기록과 동기화하여 자식 서브 모듈 히스토리를 다시 쓰는 방법은 무엇입니까?

답변

2

"Repository with submodules after rewriting history of submodule"에서 언급했듯이 쉬운 해결책이 없습니다.

당신은 당신은 서브 모듈의 역사의 SHA1 사이의 대응 관계를 설정 먼저 필요 gitlink (special entry in the index)

을 포함하여 커밋 특정 찾고, git filter-branch와 메인의 repo의 역사를 다시 작성해야합니다 주 REPO에 의해 사용되는 gitlinks는

cd /submodule/repo/just/rewritten/ 
# the old history is still available in refs/original 
git -C /path/to/rewritten/repo for-each-ref --format="%(refname)" refs/original 

cd /main/repo 
git for-each-ref --contains <SHA1> # SHA being a SHA1 from the old submodule history 

그럼 당신은

git filter-branch --prune-empty --tree-filter 'change_gitlink' 
01을 교체해야합니다

change_gitlink은 서브 모듈 폴더 (따라서 --tree-filter이 아니라 --index-filter이 아님)로 이동하는 스크립트가 될 것이고, 새로운 서브 모듈의 히스토리에서 새로운 SHA1을 체크 아웃 할 것입니다. 필터 분기는 새 gitlink를 포함하여 새 repo 상태를 커밋합니다 (서브 모듈이 올바른 새 SHA1에서 체크 아웃 되었기 때문에)

+0

update-index와 함께 인덱스 필터 --cacheinfo가 작동해야합니까? – jthill

+0

@jthill possible, yes. 서브 모듈을 체크 아웃 할 수 있어야합니다. – VonC