特に、変更が(コミットとして)表示されない/競合が発生しないように、中央の(裸の、またはそうでない)gitリポジトリ(つまり、システムに完全にアクセスできる)に変更を加えることは理論的に可能ですか?更新時に、新しくクローンされたリポジトリに表示されますか?
または、他の同様の「偽造」のような変更。
特に、変更が(コミットとして)表示されない/競合が発生しないように、中央の(裸の、またはそうでない)gitリポジトリ(つまり、システムに完全にアクセスできる)に変更を加えることは理論的に可能ですか?更新時に、新しくクローンされたリポジトリに表示されますか?
または、他の同様の「偽造」のような変更。
いいえ、それは不可能です。Git のすべてのオブジェクトは、そのコンテンツのハッシュによって一意に識別されます。これは、コンテンツを変更すると、ハッシュが変更され、元のオブジェクトとは無関係の新しいオブジェクトになることも意味します。
したがって、一部のコンテンツを変更した場合でも、その識別子を更新する必要があり (Git がそれを受け入れられるようにするため)、基本的にはリベースした場合と同じ効果があります。他の人は複製時にそれらのオブジェクトを取得しますが (たとえば、ブランチがその上を指している場合)、それらの新しいオブジェクトは元のオブジェクトと互換性がなく、競合が発生します。
Git はクローン作成時にオブジェクトの有効性をチェックし、オブジェクトが見つからないか破損しているかどうかを通知します。を使用して、ローカル オブジェクト リポジトリの検証を強制することもできますgit fsck
。変更されたオブジェクトの出力は次のようになります。
error: sha1 mismatch a98bf3503443ea6a69779fef1f6204fdae913124
error: a98bf3503443ea6a69779fef1f6204fdae913124: object corrupt or missing
missing blob a98bf3503443ea6a69779fef1f6204fdae913124