5

次のプロパティを使用して、ファイルの履歴を取得するコマンドを作成しようとしてgit logいます(コピーと名前の変更に続く):

  1. ログを注釈に従って「閉じた」状態にしたい-つまりgit blame -elfwM、履歴内のファイルをコミットする場合(ファイルがその時点で持っていた名前が何であれ)、注釈に表示されるすべてのコミットも履歴に含まれます。

  2. 履歴のすべてのエントリのファイルの元の名前を知りたいです。ファイルの名前を変更しなかったコミットの場合、これはファイル名と同じになります。行ったコミットの場合、そのコミットの各親の元のファイル名を知りたいです。

  3. ファイルの特定の注釈 (履歴の任意の時点) について、そのコミット (プロパティ 1 から存在することがわかっている) に対応する履歴エントリの作成者、日付、およびファイル名が作成者、日付、およびファイル名と一致するようにします。注釈のファイル名。

  4. (1) を満たすため、追加のコミットをできるだけ少なくしたい。特に、ファイルにまったく影響を与えなかったコミットを除外したいと考えています。

これまでのところ、私ができる最善のことは次のとおりgit log --raw --follow -m --pretty="%H%n%P%n%aL%n%cs%n%s" -- FILENAMEです。この行の背後にある私の考えは次のとおりです。

  • --follow次の名前変更とコピーの仕事をする必要があります(ただし、ファイル名はわかりません)
  • --pretty=...コミット、親、作成者、コミット日、件名を教えてください。元の作成者 + コミット日が使用されていると推測していgit blameますが、それが間違っている場合は修正してください。
  • --raw特定のコミットの元のファイル名と新しいファイル名を教えてください。
  • -m個々の親の元の名前を取得できるように、マージ コミットのエントリを分割する必要があります。

これは通常のケースでは問題なく動作するように見えますが、これが失敗するシナリオを示すスクリプトを作成しました。その実行の 1 つからの出力例を次に示します。

Created git repository at /var/folders/y4/2t2n3dhj4bz4cwsrm801t_bm0000gn/T/tmp.Rtj55RWb
Committed: cbc8198fd5eb975ab5fc1fcc66889872429a40fe (master) Initial commit
Committed: 5628acbb478a8786eaec186bf4e6050142049848 (workbench) Renamed foo.txt to bar.txt
Committed: 2f6d49b3aa35ffa2953a65e21ba5c21d130fa3b1 (workbench) Modified line 3 of bar.txt.
Committed: bac0a739a1fd2acc7c0ce466d9055942cbf87ccb (workbench) Added dummy.txt
Committed: c018ca1b4436b73237c9a727ed2353cbd8152928 (workbench) Removed dummy.txt
Committed: 18bec91206357ec23ffe53a01d20ec64f7667e4e (master) Renamed foo.txt to baz.txt
Committed: a724f0cc49f39d9e99b8794b9f263efb5bc51da1 (master) Modified line 8 of baz.txt.
Committed: 4628679d5695c9a5fb080124b854f336fdf683d1 (master) Added dummy.txt
Committed: 58f700c48a16496dfd540126dab5e55952847993 (master) Removed dummy.txt
Committed: 633056c27cf0e3afb9529d478cf51ed0bdaa918e (master) Merged bar.txt and baz.txt as foo-merged.txt
----------------------------------------
633056c27cf0e3afb9529d478cf51ed0bdaa918e
58f700c48a16496dfd540126dab5e55952847993 c018ca1b4436b73237c9a727ed2353cbd8152928
john.doe
2021-04-10
Merged bar.txt and baz.txt as foo-merged.txt
:100644 100644 27393f0 bb5a6e5 R089     baz.txt foo-merged.txt

a724f0cc49f39d9e99b8794b9f263efb5bc51da1
18bec91206357ec23ffe53a01d20ec64f7667e4e
john.doe
2021-04-10
Modified line 8 of baz.txt.
:100644 100644 4f9956e 27393f0 M        baz.txt

18bec91206357ec23ffe53a01d20ec64f7667e4e
cbc8198fd5eb975ab5fc1fcc66889872429a40fe
john.doe
2021-04-10
Renamed foo.txt to baz.txt
:100644 100644 4f9956e 4f9956e R100     foo.txt baz.txt

5628acbb478a8786eaec186bf4e6050142049848
cbc8198fd5eb975ab5fc1fcc66889872429a40fe
john.doe
2021-04-10
Renamed foo.txt to bar.txt
:100644 000000 4f9956e 0000000 D        foo.txt

cbc8198fd5eb975ab5fc1fcc66889872429a40fe

john.doe
2021-04-10
Initial commit
:000000 100644 0000000 4f9956e A        foo.txt
----------------------------------------
cbc8198fd5eb975ab5fc1fcc66889872429a40fe foo.txt (<john.doe@gmail.com> 2021-04-10  1) This is line 1
cbc8198fd5eb975ab5fc1fcc66889872429a40fe foo.txt (<john.doe@gmail.com> 2021-04-10  2) This is line 2
2f6d49b3aa35ffa2953a65e21ba5c21d130fa3b1 bar.txt (<john.doe@gmail.com> 2021-04-10  3) Modified bar
cbc8198fd5eb975ab5fc1fcc66889872429a40fe foo.txt (<john.doe@gmail.com> 2021-04-10  4) This is line 4
cbc8198fd5eb975ab5fc1fcc66889872429a40fe foo.txt (<john.doe@gmail.com> 2021-04-10  5) This is line 5
cbc8198fd5eb975ab5fc1fcc66889872429a40fe foo.txt (<john.doe@gmail.com> 2021-04-10  6) This is line 6
cbc8198fd5eb975ab5fc1fcc66889872429a40fe foo.txt (<john.doe@gmail.com> 2021-04-10  7) This is line 7
a724f0cc49f39d9e99b8794b9f263efb5bc51da1 baz.txt (<john.doe@gmail.com> 2021-04-10  8) Modified baz
cbc8198fd5eb975ab5fc1fcc66889872429a40fe foo.txt (<john.doe@gmail.com> 2021-04-10  9) This is line 9
cbc8198fd5eb975ab5fc1fcc66889872429a40fe foo.txt (<john.doe@gmail.com> 2021-04-10 10) This is line 10

3 行目はbar.txt、2f6d49b3aa35ffa2953a65e21ba5c21d130fa3b1 で変更されたことを示しています。残念ながら、このコミットは履歴に表示されません--follow-mのような生の行:100644 100644 27393f0 bb5a6e5 R089 bar.txt foo-merged.txt)。

注:この情報を取得できるが、1 つのgit logコマンドで取得できない場合は、一定数のコマンドを使用するソリューションも機能します。アノテーションを再帰的に調べて履歴を取得するようなことは避けたいと思います。また、再フォーマットなどによりすべての行が変更されたコミットがある場合、その特定の戦略も失敗します。

4

0 に答える 0