aye
두 개의 저장소 가 있고 이러한 방식으로 새 하위 디렉터리(여러 수준 깊이)에서 "재생"의 선형 기록을 bee
제거하고 싶다고 가정해 보겠습니다 .bee
bee/master
aye
파일과 커밋 메시지만 원하고 커밋 ID는 신경 쓰지 않습니다.나하다합리적인 역사를 원하기 때문에git subtree add --prefix=subdirectory
그리고git read-tree --prefix=subdirectory/
내가 찾고 있는 것이 아닙니다.
두 저장소 모두 비공개이므로 다른 저장소에 대해 기록이 다시 작성될 위험이 없습니다. 하지만,bee
하다하위 모듈이 있습니다 cee
.
답변1
첫 번째,기록을 다시 작성하여 bee
모든 파일을 하위 디렉터리로 이동:
cd /path/to/bee
git filter-branch --force --prune-empty --tree-filter '
dir="my fancy/target directory"
if [ ! -e "$dir" ]
then
mkdir --parents "${dir}"
git ls-tree --name-only "$GIT_COMMIT" | xargs -I files mv files "$dir"
fi'
git log --stat
이제 표시되어야 합니다 my fancy/target directory
.aye
기록을 쉽게 병합:
cd /path/to/aye
git remote add -f bee /path/to/bee
git checkout -b bee-master bee/master
git rebase master
git checkout master
git rebase bee-master
다음 위치에서 하위 모듈을 다시 만듭니다 aye
.
git submodule add git://my-submodule 'my fancy/target directory/my-submodule'
마지막으로 정리할 수 있습니다 aye
.
git rm 'my fancy/target directory/.gitmodules'
git branch --delete --force bee-master
git remote remove bee
저장소의 절대 경로를 수정해야 할 수도 있습니다(예 .gitignore
:
답변2
더 빠른 버전(모자 팁이 답변):
git filter-branch --index-filter 'git ls-files -s | sed "s-\t\"*-&newsubdir/-" | GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info && mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"'
newsubdir
원하는 디렉터리나 중첩된 디렉터리로 바꾸세요 . macOS에서는 gsed
( sed
install )을 사용해야 할 수도 있습니다 brew install gnu-sed
.