Gitには履歴の書き換えを防ぐための「セーフモード」がありますか?


11

Git(および一般的にDVCS)を使い始めて、履歴書き換えの変更を検討し始めたとき、リポジトリがローカルのみの場合は安全ですが、リモートで作業してみようとすると問題が発生する可能性がありますそのような変更をプッシュします。

私が期待している機能は、「セーフモード」を有効にする機能です。これにより、基本的に、私がすべきでないことは何もできなくなります。そして、それはどういう意味ですか?つまり、すでにオリジンにプッシュされたものの履歴書き換えの変更を意味します。正確に定義することはできませんが、これには次のようなケースが含まれます。

  • commit --amend HEADがすでにプッシュされている場合
  • rebase 非ローカルブランチの
  • reset プッシュされたブランチの

これらは、おそらく次のpush失敗をもたらす状況の例です(IIRCは早送りではないため)。そのうちのいくつかを偶然に作成し、リモートでブランチを再作成する必要がありました。そして、私はこれを十分に速く実行できたので、私が書き直した歴史を誰も引き出せなかったのは幸運でした。

この種の変更を特定し、必要に応じて、ユーザーがそれらを変更できないようにすることは可能だと思います。おそらくそのためのオプションはありますか?

存在しない場合、作成しようとする価値があると思いますか?そのような「危険な変化」を特定する方法を正確に定義してみませんか?


悪い変更をコミットすることが他のプログラマーに影響を与える作業環境では、それが機能するはずだと確信できない限り、おそらくこれらのアクションを実行することに抵抗があるはずです。それでも、問題がその後も持続しないことを確認する必要があります。数年前、私は多くのプログラマーのチームにいて、コンパイルなかったソースをコミットするという不安を抱かなかったと想像してください!私はその3ヶ月後に彼を射殺したかった。
ニール

リモートマシンのフックでこれを検出し、変更を拒否することは理にかなっているようです。
アンドリューTフィンネル


質問がありません。デフォルトのモードは安全です。を指定しない限り、プッシュすることはできません--force
Let_Me_Be

私もこのようなものを見たいです。基本的に、おそらくコマンドラインをラップし、基本、つまりコミット、プル、プッシュ、単純なものだけを公開することで、gitを学習している人に安全なバージョンを提供したいと思います。このページの内容については、完全なgitを強制します:git-scm.com/book/en/Git-Tools-Rewriting-History Gitは、ローカルおよびリモートのリポジトリを考えるための他のツールよりも学習が少し難しくなっています-ロールバックの代わりにリベースするかもしれないという心配は怖いです。
クリスモスキーニ

回答:


5

これは、Git履歴の書き換えを防止またはキャッチするための戦略と同じではないにしても、非常に近いように見えます

まとめると、有効にすることができます

git config --system receive.denyNonFastforwards true

そして

git config --system receive.denyDeletes true

または、投稿受信フックを作成して、書き換えと判断したものを拒否します。


1
denyNonFastforwardsはデフォルト(?)であると信じていますが、そうでdenyDeletesはありません。これらの2つは便利ですが、commit --amendプッシュできない場合(つまり、HEADが既にプッシュされているため)を実行できないクライアント側のソリューションを想像しています。
コス

言い換えれば、リモートの一貫性を保つメカニズムに加えて、リモートとのクローンの「一貫性」を保つことができるものが欲しいのです。
コス

@Kosローカルフックも作成できます
アンドリューTフィンネル

設定する方法があるdenyNonFastfowardstruemasterブランチにだけは?トピックブランチがリベースされ、強制的にプッシュされることを許可します。
nnyby

2

いいえ、それはgitの哲学の一部であり、あなたにフルパワーを与え、あなたが望むようにそのパワーを管理できるようにするためです。

この哲学に固執しない場合、Mercurialに切り替えることは、履歴を書き換えることができますが、限られた方法で、または明らかに、消極的な方法で、それは良いアイデアではないと感じさせるため、価値があります。


2
私は失敗する。危険なことをしているときはいつでも明示的に確認する必要があるメカニズムは、「自分の力を自分の望むように管理する」ことに収まるようです。:
コス

2

知る限り、gitがこれらの問題を解決する方法は、そのようなアクションをリクエストするたびにローカルでそれを実行しますが、あなたがしていることは望ましくない結果をもたらす可能性があることを知らせます。その時点では、まだ何もプッシュしていないので、ローカルリポジトリを確認し、プッシュする前に危険な変更を取り消すことができます。ただし、gitが何を伝えているかに注意を払う必要があり、そのようなエラーを修復するときは注意が必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.