web-dev-qa-db-ja.com

移動したファイルを除くすべてのファイルがサブディレクトリにあるように、履歴を書き換えるにはどうすればよいですか?

gitの下にプロジェクトがあります。ある日、すべてのプロジェクトファイルを現在のディレクトリからプロジェクトの下のfoo/bar/に移動しました。 git mvを使用しました。次に、いくつかのファイルを追加し、既存のファイルに変更を加えました。

その結果、foo/bar/file.cの履歴を見ると、ファイルを移動した後に行った変更のみを確認できます。

私はこれをさまざまな方法で修正しようとしましたが(filter-branch with subdirectory filterなど)、何も役に立たなかったので、ここではかなりスタックしています。あなたが私に与えることができるあらゆる助けに感謝します。ありがとう!

55

ファイルを移動して履歴を書き換えるには:

すべてのファイルが常に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'

これで、すべてのファイルがalwaysfoo/barにあるかのように履歴が記録されます。

移動したファイルの履歴を表示するには:

過去のある時点で移動または名前が変更されたファイルの履歴を表示するだけの場合は、--followオプションをgit logに使用するだけです。

git log --follow foo/bar/file.c
93
Dan Moulding

ここでまとめると、私がしたことの簡単な要約です。私のために働いたコマンドは:

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に感謝します。

7