aye
2つのリポジトリがあり、この方法で新しいサブディレクトリ(複数レベルの深さ)から「再生」の線形記録を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
。