59

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

その結果、の履歴を見るとfoo/bar/file.c、ファイルを移動した後に行った変更のみが表示されます。

私はこれをさまざまな方法で(filter-branchサブディレクトリフィルターなどを使用して)修正しようとしましたが、何も役に立たなかったので、ここでかなりスタックしています。あなたが私に与えることができるどんな助けにも感謝します。ありがとう!

4

3 に答える 3

102

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

すべてのファイルが常にディレクトリにあるようにプロジェクトの履歴を表示したい場合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'

これで、すべてのファイルが常ににあったかのように履歴が記録されますfoo/bar

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

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

git log --follow foo/bar/file.c
于 2010-10-28T12:36:33.200 に答える
7

最後に、私が行ったことを簡単にまとめます。私のために働いたコマンドは次のとおりです。

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 Molding (!!!) と Jefromi に感謝します。

于 2010-11-02T10:42:17.900 に答える