발생해야합니다 external
두 가지에서 일어난 main
모든 관련 변경에 가져하기 위해서 :
- 원래
main
- 이
external
에서 일어난 모든 커밋
main
에 가져와 분리
처음에는 원본을 분리하십시오 main
:
아마도 자신의 저장소에 main
이있는 것 같습니다.
원래 main
이 external/main
서브 디렉토리를 작성한 확약의 상위로 설정된 경우에만 external
저장소에서 검색 될 수 있습니다. 그러한 예는 Git Book Subtree Merging page
에 설명 된 프로세스입니다. 여기서 소개 된 하위 트리는 in this answer과 같습니다.
그리고 나서 main
의 자료 인 전체 커밋 집합을 잡아서 저장소를 만들어야합니다. 두 번째의 경우
, 이 main
에 가져와 그것을 external
에서 일어난 모든 커밋 :
당신은 이미
exteral/main
하위 폴더에 변경 사항이 포함 커밋을 고립,하지만 당신이 상태로는 포함되어 있지 않습니다
원래 main
이 커밋됩니다. filter-branch
만 하위 디렉토리를 만든 read-tree
처럼 더 복잡한 작업을 처리하는 방법을 모른 채, 특정 하위 디렉토리 위치에있는 파일을 확인하기 때문에
git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter main -- --all
이다.
filter-branch
작업 후에는 main/external
에 발생한 모든 변경 사항을 포함하는 커밋 집합이 남아있게됩니다. filteredMain
브랜치에서이 커밋 세트에 도달 할 수 있다고 가정 해 보겠습니다.
내용이 서브 디렉토리에서 루트로 이동되었으므로 파일의 위치는 이제 main
저장소의 내용과 동일합니다. 이렇게하면 두 나무가 결합됩니다. 이 두 트리 (main
의 master 브랜치와 filterBranch
)는 공통된 히스토리가 없기 때문에 커밋 변경을 재생하여 rebase
을 결합 할 수 있습니다.
# in the main repository
# bring the external repository and get the branch
git remote add external /path/to/external
git fetch external filteredMain
git checkout filteredMain
# We need the first commit of this tree for the rebase command
firstCommit=$(git rev-list --max-parents=0 HEAD)
# run the rebase
git rebase --onto master $firstCommit filteredMain
이 후 filteredMain
지점은 main
저장소에 원래 master
지점의 상단에 재생 external/main
에서 일어난 모든 변경 사항을 포함해야합니다.
'ZZZ'는 어떻게'AAA'에 병합 되었습니까? – LopSae
또한 약간의 의미를 전달하는 이름을 사용할 수 있습니다. 예를 들어 리포지토리의 경우 'main'과'external'와 같이 질문의 가독성을 높이는 데 도움이됩니다. – LopSae
일반적인 메커니즘 :'external'에서 repo를 가져 와서'read-tree '를 사용하여'external' repo의 디렉토리에 넣습니다. – bwoebi