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


123

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

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

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

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

それまでの間、この「役立つ」ポップアップを廃止したいと思います。


1
そのダイアログは、多くの人々がそれが存在しないことを望むであろう「機能」の素晴らしい例です。煩わしいだけでなく、ハードリセット後に切り離された重要なコミットを消去する可能性があります。
adelriosantiago 2017

回答:


169

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

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

git config --global gui.gcwarning false

古いバージョンを使用している場合は/lib/git-core/git-guiafter 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


3
オブジェクトafter 1000 hint_gc10000緩めた後に警告が発生するように増やすことができますか?
sashoalm 2017

@sashoalm同意する。理由があります。
HankCa

正しい理由は何なのかと思いますが、そのダイアログは非常に苦痛であり、明確な理由が明確に説明されていないので、確かに上記のコマンドをたたくだけになりたくなります。
Josh Mc、

2
@sashoalm:多分これはあなたが言っていることですが、「1000」はafter 1000ダイアログが表示されるまで待機するミリ秒数を指します。「10000」に増やすと、ダイアログは表示されますが、代わりに10秒かかります。
fuglede

1
ただし、@ NickDandoulakisの回答で述べたようにdatabase.tcl、制限の定義が含まれており、ダイアログの頻度を減らすために増やすことができます。
fuglede

50

更新:git prune問題を「解決」し、それらのルーズオブジェクトを削除します
(デフォルトでは、2週間以上経過したルーズオブジェクトのみをgit gc呼び出しgit pruneます)。
ただし、OPマイケル・ドノヒューとしてがコメントで言及しているように、

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


元の答え:

git gcすべての緩いオブジェクトを削除ないという問題は以前に報告されています(2008年後半、git gc」は緩いオブジェクトを削除しないようです) "

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

" git gc"は、到達不能になり、現在パックに入っていたオブジェクトをアンパックします。
その結果、gitリポジトリで使用されるディスク領域の量は、実際にファイルシステムでフルに近い状態で実行されている誰かが追跡リポジトリから多数のブランチを削除する「」操作の後に劇的に増加git gcする可能性があります。 、次に「git gc "を実行すると、非常に不愉快な驚きが生じることがあります。

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

それらは " git prune"の後に消えますが、私がこのハウスキーピング操作をするとき、私はしばしば--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 gc"へのオプションを望んでいました。

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

(おそらくgc.pruneexpire、上記の動作が発生するために必要な構成変数で「今」を使用します)。


あなたも持っています(同じスレッドから):

repack -a -d -l

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

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


1
'git prune'はおそらく私の直近の問題を解決するでしょう-私は今日それを後で試します。ただし、ルーズオブジェクトを2週間保持するという安全面が気に入っています。前に戻って古いリビジョンを確認したいので、このソリューションはあまり好きではありません。私はgitのサイズやパフォーマンスに問題はありません。データベースを圧縮しても効果がない場合でも、データベースの圧縮を要求するのは「git gui」だけです。
マイケルドノヒュー

非常に役立つコメント。その迷惑な「ルーズオブジェクト」メッセージは本当に迷惑になりました。とにかく、そのカウントはどこから来るのですか?git-fsckの出力でしょうか?
David Dombrowsky、

おかげで-私もgit gcが削除していない緩いオブジェクトがありました-git pruneが答えでした。
シェッド

リポジトリの外でgit pruneを実行したところ、一部のオブジェクトがクリアされました。次に、問題リポジトリに移動してgit pruneを実行したところ、すべての問題が解消されました。
Nicholas Orlowski 2013年

「git prune」は、OP(および私)が抱えていた問題を解決します。「これは以前に行ったことがあり、ルーズオブジェクトを約250に減らしますが、ポップアップは抑制されません。」
Eike

32

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

git gc

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

更新:(TEDの提案により)

以下のルーチンを抽出しました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
        }
    }
}

1
ダイアログで[OK]をクリックしないと、それだけではありませんか?gcがすべての緩いオブジェクトを削除しなかった場合でも、ダイアログは表示されます。
TED

[OK]をクリックし、コマンドラインから 'git gc'を実行しました。どちらも250になりましたが、再度実行してもそれ以上は進みません。
マイケルドノヒュー

3
私はそれが奇妙なことを知っていますが、ベースをguiから取り除くと時々緩いオブジェクトが残ることがあります。GUIを閉じてgit-gcを実行すると、すべてのゴミがなくなります。
ニックダンドゥラキス09

3
Tclを変更すると修正されます。Windowsの制限を10 * 250に増やしました。ありがとうございます。
マイケルドノヒュー

git gcコマンドラインから実行している私にとって問題は解決しました... okgit guiをクリックしただけでは何とかうまく
いき

3

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

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

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