2

私の Git ブランチで、コミットを作成してプッシュしました。後で、インデックスに変更を加え、 used git commit --amend、次にgit push -f. 私の新しいコミットは、ブランチのローカルとリモートの両方で最初のコミットをオーバーライドしました。

この時点で、元のコミットが存在しないか、少なくとも (おそらく reflog に) 存在するが、親が存在しないことを期待 (または希望) します。そのため、GC を実行すると、存在しなくなります。 . ただし、コミットはまだそこにあるようで、その親はまだ無傷です。(この場合、私がそれを知った方法は Jira 経由で、github でオーバーライドされたコミットにリンクされていました)

どうしてこんなことに?どのように削除されますか?これは、誤ってパスワードを GitHub にプッシュしてからgit commit --amendorを使用してから を使用するgit resetgit push -f、コミットが実際には削除されないということですか?

4

2 に答える 2

1

git gc --prune=allgit 2.7 (2015 年第 4 四半期) では、「 」に関する警告が導入されました。

Junio C Hamano ( )によるcommit fae1a90 (2015 年 10 月 14 日)を参照してください。( 2015 年 10 月 20 日コミット ce555f3Junio C Hamanoによってマージされました)gitster
gitster

Documentation/gc: 警告する--prune=<now>

" git gc" はいつでも安全に実行できますが、これは、ref の更新を待っている他のプロセスによって作成されたオブジェクトを保護する猶予期間が組み込まれているためです。
猶予期間なしで実行するには、ユーザーはリポジトリが静止していることを確認する必要があります

quiescent : gitユーザーマニュアルページですでに言及されています:

git prune静止リポジトリでのみ実行する必要があります。これは、ファイルシステムのfsck回復を行うようなものです。ファイルシステムがマウントされている間は、それを行いたくありません。

静止とは、非アクティブまたは休止状態の状態または期間にあることを意味します。

新しいドキュメントには次のように記載されています。

--prune=all年齢に関係なく緩いオブジェクトを整理します
(何をしているのか正確に把握していない限り使用しないでください。 リポジトリが静止していない限り、参照に固定されていない新しく作成されたオブジェクトが失われ、リポジトリが破損することになります--prune=all
)。
--pruneデフォルトでオンになっています。

于 2015-10-21T05:31:42.563 に答える
1

からgit help gc:

--prune=<date>

date より古いルース オブジェクトを削除します (デフォルトは 2 週間前で、構成変数 gc.pruneExpire でオーバーライドできます)。--prune=all年齢に関係なく、緩いオブジェクトを剪定します。--pruneはデフォルトでオンになっています。

したがって、おそらく実行したいでしょうgit gc --prune=all

于 2015-09-10T11:42:15.530 に答える