git
の下にプロジェクトがあります。ある日、すべてのプロジェクトファイルを現在のディレクトリからプロジェクトの下のfoo/bar/
に移動しました。 git mv
を使用しました。次に、いくつかのファイルを追加し、既存のファイルに変更を加えました。
その結果、foo/bar/file.c
の履歴を見ると、ファイルを移動した後に行った変更のみを確認できます。
私はこれをさまざまな方法で修正しようとしましたが(filter-branch
with subdirectory filterなど)、何も役に立たなかったので、ここではかなりスタックしています。あなたが私に与えることができるあらゆる助けに感謝します。ありがとう!
ファイルを移動して履歴を書き換えるには:
すべてのファイルが常にfoo/bar
ディレクトリにあるかのようにプロジェクトの履歴を表示したい場合は、少し手術を行う必要があります。 「ツリーフィルター」でgit filter-branch
を使用してコミットを書き換え、foo/bar
が存在しない場合は作成して、すべてのファイルをそこに移動します。
git filter-branch --Prune-empty --tree-filter '
if [ ! -e foo/bar ]; then
mkdir -p foo/bar
git ls-tree --name-only $GIT_COMMIT | xargs -I files mv files foo/bar
fi'
これで、すべてのファイルがalwaysでfoo/bar
にあるかのように履歴が記録されます。
移動したファイルの履歴を表示するには:
過去のある時点で移動または名前が変更されたファイルの履歴を表示するだけの場合は、--follow
オプションをgit log
に使用するだけです。
git log --follow foo/bar/file.c
ここでまとめると、私がしたことの簡単な要約です。私のために働いたコマンドは:
if [ ! -e foo/bar ]; then mkdir -p foo/bar; git ls-tree --name-only $GIT_COMMIT | grep -v ^foo$ | xargs -I files mv files foo/bar || echo ""; fi
最後に追加したechoコマンドにより、mvが失敗した場合でも、コマンド全体が実行し続けることが保証されました。 foo/bar/fooの内容は移動しませんでしたが、私はそれと共存できます。
Dan Moulding (!!!)とJefromiに感謝します。