2

DragonFly BSD は git を SCM として使用し、カーネルとユーザーランド全体の両方に対して単一のリポジトリとブランチを使用します。

2011 年 11 月 26 日、ほとんどのファイルがまったく変更されていないにも関わらず、誰かが何らかの形でリポジトリ内のすべてのファイルを変更するコミットを行いました。


これは、2011 年 11 月26 日の問題のあるコミットです

それ以来、いくつかのツールで、リポジトリ内の任意のファイルのファイル履歴を見ると、そのコミットで 2011 年 11 月 26 日に変更されたことがわかりますが、一部のツールでのみ表示され、その他。

たとえば、偽の 2011-11-26 コミットは、次のツールでは表示されません。

ただし、偽のコミットは次のように誤って表示されます。

  • git whatchanged --pretty=%at sys/sys/sensors.h

    1322296064
    
    :000000 100644 0000000... 554cfc2... A  sys/sys/sensors.h
    1191329821
    
    :000000 100644 0000000... 554cfc2... A  sys/sys/sensors.h
    

    1322296064 の時間は偽物であり、ファイルがA削除されずに追加されたこと、およびdstsha1 が同じであることに注意してください。ファイルが削除されておらず、まだ同じsha1を持っていると考えるとほとんど意味がありませんが、srcsha1が常にそのような偽のコミットであることを示す別のより代表的な例:0000000...dst

    % git whatchanged --pretty=%at sys/sys/sysctl.h | head -9
    1322296064
    
    :000000 100644 0000000... 6659977... A  sys/sys/sysctl.h
    1296826445
    
    :100644 100644 94b8d96... 6659977... M  sys/sys/sysctl.h
    1292413105
    
    :100644 100644 8c9deaa... 94b8d96... M  sys/sys/sysctl.h
    
  • http://gitweb.dragonflybsd.org/dragonfly.git/history/HEAD:/sys/sys/sensors.h

私の質問は次のとおりです。

  • そもそも削除せずにファイルを追加することができたのはなぜですか? /そのようなことを許可するのはgitのバグですか?

  • このような偽のコミットを圧縮する (そしてユーザーから隠す) ツールとそうでないツールがあるのはなぜですか?

  • と同じように、実際には変更されていないファイルでそのような偽のコミットを作成して無視するgit-whatchanged方法はありますか?gitwebgit-loggithub

4

1 に答える 1

2

問題のコミットを見て、答えを見つけました:

これは「ルート コミット」です。親はありません。通常、このプロパティを持つリポジトリ内の唯一のコミットは、これまでの最初のコミットです。

古いバージョンが存在しないため、このコミットのすべてのファイルは実際に新しいものです。

git logこのコミットはマージ ポイントの最初の親ではないため、除外されます。git logそもそも無視すべきものがあると信じるに至る論理がわかりません。

いいえ、他のツールがそのようなコミットを無視するようにする方法はありません。

ここで間違っていたのは、このコミットは親なしで作成されるべきではなく、誰かがこのようなコミットを作成した場合、それをどこにもマージしてはならないということです。

于 2013-01-31T23:24:51.223 に答える