git 하위 트리를 사용하여 실험하고 있으며 다음과 같은 상황이 발생했습니다.
git 하위 트리를 사용하여 리포지토리에 외부 프로젝트를 추가했습니다. 프로젝트 히스토리를 참조하고 나중에 업스트림 프로젝트에 다시 기여하기 위해 의도적으로 업스트림 프로젝트의 모든 히스토리를 유지했습니다.
결과적으로, 업스트림 프로젝트의 다른 제공자가 실수로 큰 파일을 마스터 브랜치로 푸시했습니다. 이 문제를 해결하기 위해 업스트림 프로젝트는 기록을 다시 작성하고 강제로 마스터에게 푸시했습니다. "모노 레포"를 만들 때이 커밋을 포함 시켰으며이를 제거하고 싶습니다.
하위 트리의 새 기록을 반영하도록 저장소를 업데이트하려면 어떻게해야합니까?
첫 번째 시도는 filter-branch를 사용하여 하위 트리와 모든 기록을 완전히 제거하는 것이 었습니다.
git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch upstream-project-dir' --prune-empty HEAD
이전 버전의 하위 트리가 제거되면 새로운 업스트림 마스터를 사용하여 하위 트리를 다시 추가 할 수 있습니다. 그러나 어떤 이유로 커밋 기록이 여전히 git log 출력에 표시되기 때문에 이것은 작동하지 않았습니다.
최신 정보
최소한의 재현 가능한 예제를 만드는 단계를 작성했습니다.
먼저 빈 자식 저장소를 만듭니다.
git init test-monorepo cd ./test-monorepo
초기 커밋을 만듭니다.
echo hello world > README git add README git commit -m 'initial commit'
이제 외부 프로젝트의 하위 트리를 추가하십시오.
git remote add thirdparty git@github.com:teivah/algodeck.git git fetch thirdparty git subtree add --prefix algodeck thirdparty master
monorepo에 대한 커밋 만들기
echo dont panic >> algodeck/README.md git commit -a -m 'test commit'
이제 git filter-branch를 사용하여 하위 트리를 제거하십시오.
git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch algodeck' --prune-empty HEAD
자식 로그 출력을 검사하면 초기 커밋 만 볼 것으로 예상됩니다.
git log
git gc --prune=now
하지 않았지만에 나타나지 않는 커밋 만 삭제하지는 git log
않습니까?
git log
논쟁을하지 않고 있었고 , 여전히 오래된 커밋을 보았습니다.