web-dev-qa-db-ja.com

Gitを使用したファイルコピー操作の記録

Git-mvを使用してgitでファイルを移動すると、ステータスがファイルの名前が変更されたことを示し、一部を変更してもほとんど同じものと見なされます(履歴を追跡できるので良いことです) 。

ファイルをコピーするとき、元のファイルには履歴があり、新しいコピーに関連付けたいと思います。

ファイルを移動してから元の場所で再チェックアウトしようとしました-いったんgitを移動すると、元の場所をチェックアウトできません。

ファイルシステムのコピーを行ってからファイルを追加しようとしました-gitは新しいファイルとしてリストします。

Gitがファイルのコピー操作を記録する方法はありますか?それは、ファイルの名前変更/移動を記録する方法と同様の方法で、履歴を元のファイルに戻すことができますか?

129
Hexdoll

Gitは名前の変更の追跡もコピーの追跡も行いません。つまり、名前の変更やコピーはrecordしません。代わりに、名前の変更とコピーdetectionが行われます。 git diffオプションを使用してgit show(および-M)で名前変更の検出を要求できます。-Cオプション(-C-Mを意味し、--find-copies-harderまたは-C -C(これは-Cを意味し、-Mを意味します。 )。 git-diff マンページを参照してください。

diff.renamesをブール値の真の値(例:trueまたは1)に設定することで、常に名前変更検出を行うようにgitを設定することもできます。 copyまたはcopiesへ。 git-config マンページを参照してください。

-lgit diffオプションと関連する構成変数diff.renameLimitも確認してください。


Gitではgit log <pathspec>の動作が異なることに注意してください。ここで<pathspec>はパス区切り文字のセットです。ここで、pathは(サブ)ディレクトリ名です。履歴のフィルタリングと簡素化beforeの名前変更とコピー検出が有効になります。名前の変更とコピーを追跡する場合は、git log --follow <filename>を使用します(現在は少し制限があり、単一のファイルでのみ機能します)。

108
Jakub Narębski

Gitにコピーされたファイルの履歴を強制的に検出させることができます。

  • コピーする代わりに、新しいブランチに切り替えて、moveファイルを新しい場所に移動します。
  • 元のブランチに切り替えて、ファイルの名前を変更します。
  • 新しいブランチを元のブランチにマージし、両方のファイルを保持することで些細な競合を解決します。
  • 別のコミットで元のファイル名を復元します。

https://stackoverflow.com/a/44036771/138968 から取得したソリューション)

30
Robert Pollak