web-dev-qa-db-ja.com

「git gui」を実行しているときに「Loose Object」ポップアップをスキップする方法

「git gui」を実行すると、ポップアップが表示されます

現在、このリポジトリには約1500個のルーズオブジェクトがあります。

次に、データベースの圧縮を提案します。これは以前に行ったことがあり、ルーズオブジェクトを約250に減らしますが、ポップアップを抑制しません。再度圧縮しても、ルーズオブジェクトの数は変わりません。

現在のワークフローでは、Perforceから移行する際に「リベース」を大幅に使用する必要があり、Perforceは依然として標準的なSCMです。 Gitが正規のSCMになったら、定期的なマージを行います。ルーズオブジェクトの問題は大幅に軽減する必要があります。

とりあえず、この「役に立つ」ポップアップを消したいと思います。

113
Michael Donohue

まだ誰も答えていないので、コードを調べて、そのダイアログを表示するコードを削除する方法を確認しました。それを行うhint_gcプロシージャと、それが呼び出される場所を見つけました。同時に、2011年後半に ダイアログを無効にするための構成オプション が追加されたことに気付きました。この変更(git-gui 0.16.0の一部)は、Gitのメインラインの 2011-12-14 にマージされました。

Git v1.7.9以降を使用している場合、次のコマンドで警告ダイアログを無効にできます:

git config --global gui.gcwarning false

古いバージョンを使用している場合は、/lib/git-core/git-guiを編集してafter 1000 hint_gc行を削除するか、/usr/share/git-gui/lib/database.tclを編集してhint_gcプロシージャの本体を削除できます。 (これらのファイルパスはCygwin上にあります-他の環境では、ファイルは別の場所にある可能性があります。Windowsの場合はc:\Program Files\Git\mingw64\libexec\git-core\git-gui.tclです)

152
Esko Luontola

更新: git Prune は、これらのゆるいオブジェクトを削除するという点で、問題を「解決」します
git gcgit Pruneを呼び出しますが、デフォルトでは2週間以上経過した緩いオブジェクトに対してのみです)。
ただし、 OP Michael Donohue がコメントで言及しているように:

私は戻って戻って古いリビジョンを見たい場合、2週間ルーズなオブジェクトを保持することの安全面が好きなので、このソリューションはあまり好きではありません。
gitのサイズやパフォーマンスに問題はありません。データベースを圧縮しても効果がない場合でも、データベースの圧縮を要求するのは「git gui」だけです。


元の回答:

"git gc"がallゆるいオブジェクトを削除しないという問題は以前に報告されています(2008年後半、 " " git gc "はしませんゆるいオブジェクトをもう削除するようです "

git gcは、2週間以上経過したルーズオブジェクトのみを削除します。本当に削除したい場合は、git Pruneを実行してください。
しかし、実行時に他のgitプロセスがアクティブにならないようにしてください。そうしないと、何かを踏む可能性があります。

git gc」は、到達不能になり現在パックに入っているオブジェクトをunpackします。
その結果、gitリポジトリで使用されるディスク容量は、実際には「git gc」の後に劇的にup移動できます「ファイルシステム上でフルに近い状態で実行している人にとっては驚くべき操作であり、トラッキングリポジトリから多数のブランチを削除し、その後「git gc」を実行すると、非常に不快な驚きが得られます。

[例:]古いブランチは、next-20081204などのタグを介して予約されています。
linux-nextリポジトリのローカルコピーを毎日更新すると、これらの古いブランチタグが大量に蓄積されます。
その後、それらのシリーズ全体を削除し、git-gcを実行すると、操作にかなり時間がかかり、使用されるブロックとiノードの数が大幅に増加します。

git Prune」の後に消えますが、このハウスキーピング操作を行うとき、「git gc」の--yes-I-know-what-I-am-doing-and-it's-unsafe-but-just-drop-the-unreachable-objects-cause-this-is-just-a-tracking-repositoryオプションが必要になることがよくあります。

あなたの場合、「git Prune」は役に立ちますか?

(おそらく、gc.pruneexpire config変数で "now"を使用すると、上記の動作が発生するために必要になります)。


また、(同じスレッドから):

repack -a -d -l

小文字の「a」に注意してください。

git-gcは、大文字の 'A'でrepackを呼び出します。これにより、到達不能オブジェクトがアンパックされます。リトル 'a'は、自分が何をしているかを知っていて、gitに到達できないオブジェクトをドロップしたい人のためのものです。

47
VonC

「Loose Object」ポップアップが表示されたら、gitのガベージコレクターを実行する時間です。

git gc

その後、ポップアップは消えます。

更新:(T.E.D.の提案による)

以下のルーチンをgit/share/git-gui/lib/database.tclから抽出しました
ニーズに合わせて変更できます。

proc hint_gc {} {
    set object_limit 8
    if {[is_Windows]} {
        set object_limit 1
    }

    set objects_current [llength [glob \
        -directory [gitdir objects 42] \
        -nocomplain \
        -tails \
        -- \
        *]]

    if {$objects_current >= $object_limit} {
        set objects_current [expr {$objects_current * 256}]
        set object_limit    [expr {$object_limit    * 256}]
        if {[ask_popup \
            [mc "This repository currently has approximately %i loose objects.

To maintain optimal performance it is strongly recommended that you compress the database when more than %i loose objects exist.

Compress the database now?" $objects_current $object_limit]] eq yes} {
            do_gc
        }
    }
}
30

うーん...... docs にコマンドライン引数がありません。

いつでもソースをプルダウンし、ダイアログのコードを取り出して再構築できると思います。

3
T.E.D.