Git 저장소 기록을 하위 디렉터리로 재생하는 방법은 무엇입니까?

Git 저장소 기록을 하위 디렉터리로 재생하는 방법은 무엇입니까?

aye두 개의 저장소 가 있고 이러한 방식으로 새 하위 디렉터리(여러 수준 깊이)에서 "재생"의 선형 기록을 bee제거하고 싶다고 가정해 보겠습니다 .beebee/masteraye파일과 커밋 메시지만 원하고 커밋 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( sedinstall )을 사용해야 할 수도 있습니다 brew install gnu-sed.

관련 정보