Como pular a janela pop-up “Loose Object” ao executar 'git gui'

123

Quando executo 'git gui', recebo um pop-up que diz

Atualmente, este repositório possui aproximadamente 1500 objetos soltos.

Em seguida, sugere compactar o banco de dados. Já fiz isso antes e reduz os objetos soltos para cerca de 250, mas isso não suprime o pop-up. A compactação novamente não altera o número de objetos soltos.

Nosso fluxo de trabalho atual exige o uso significativo de 'rebase' à medida que estamos migrando do Perforce, e o Perforce ainda é o SCM canônico. Uma vez que o Git é o SCM canônico, faremos fusões regulares, e o problema de objetos soltos deve ser bastante atenuado.

Enquanto isso, eu realmente gostaria que esse pop-up 'útil' desaparecesse.

Michael Donohue
fonte
1
Esse diálogo é um ótimo exemplo de um "recurso" que muitas pessoas gostariam que ele não existisse. Não é apenas irritante, pode apagar confirmações importantes que foram desanexadas após uma reinicialização total.
adelriosantiago

Respostas:

169

Como ninguém ainda tinha uma resposta, examinei o código para ver como remover o código que aparece nessa caixa de diálogo. Encontrei o hint_gcprocedimento que faz e o local onde é chamado. Ao mesmo tempo, notei que no final de 2011 foi adicionada uma opção de configuração para desativar a caixa de diálogo . Essa alteração (parte do git-gui 0.16.0) foi mesclada à linha principal do Git em 14/12/2011 .

Portanto, se você usar o Git v1.7.9 ou mais recente, poderá desativar a caixa de diálogo de aviso com o seguinte comando:

git config --global gui.gcwarning false

Se você estiver usando uma versão mais antiga, poderá editar /lib/git-core/git-guie remover a after 1000 hint_gclinha ou editar /usr/share/git-gui/lib/database.tcle remover o corpo do hint_gcprocedimento. (Esses caminhos de arquivo estão no Cygwin - em outros ambientes, os arquivos podem estar em locais diferentes. No Windows, existe c:\Program Files\Git\mingw64\libexec\git-core\git-gui.tcl)

Esko Luontola
fonte
3
Podemos aumentar after 1000 hint_gcpara que o aviso aconteça após 10000objetos soltos?
Sashoalm 17/02
@sashoalm Concordo. Está lá por uma razão.
HankCa
Pensando em quais são exatamente as boas razões, esse diálogo é uma dor, sem boas razões claramente explicadas, estou certamente muito tentado a simplesmente dar um tapa no comando acima.
Josh Mc
2
@sashoalm: Talvez seja isso que você quer dizer, mas o "1000" after 1000refere-se ao número de milissegundos a esperar até que a caixa de diálogo seja exibida. Ao aumentá-lo para "10000", a caixa de diálogo ainda aparecerá, mas levará 10 segundos para fazê-lo.
Fuglede
1
No entanto, conforme mencionado na resposta de @ NickDandoulakis, database.tclcontém a definição do limite e pode ser aumentado para tornar o diálogo menos frequente.
Fuglede
50

Atualização: git prune"resolveria" o problema, pois removeria esses objetos soltos
( git gcchamadas git prune, mas apenas para objetos soltos com mais de duas semanas, por padrão).
No entanto, como o OP Michael Donohue menciona nos comentários:

Eu gosto do aspecto de segurança de manter os objetos soltos por duas semanas, caso eu queira voltar e examinar algumas revisões antigas, para que eu realmente não goste desta solução.
Não estou tendo nenhum problema com o tamanho ou o desempenho do git, é apenas o 'git gui' que insiste em me pedir para compactar o banco de dados, mesmo quando compactá-lo não teria efeito.


Resposta original:

O problema de " git gc" não remover todos os objetos soltos já foi relatado antes (no final de 2008, " " git gc"parece não remover mais objetos soltos "

git gcremove apenas objetos soltos com mais de duas semanas. Se você realmente deseja removê-los agora, execute git prune.
Mas certifique-se de que nenhum outro processo git possa estar ativo quando você o executar, ou ele poderá pisar em alguma coisa.

" git gc" descompactará objetos que se tornaram inacessíveis e estavam atualmente em pacotes.
Como resultado, a quantidade de espaço em disco usada por um repositório git pode realmente aumentar drasticamente após uma " git gc" operação, o que pode ser surpreendente para alguém que está executando quase completamente em seu sistema de arquivos, exclui várias ramificações de um repositório de rastreamento , e então " git gc" pode receber uma surpresa muito desagradável.

[Exemplo: ]ramificações antigas são reservadas por meio de uma tag como next-20081204.
Se você atualizar sua cópia local do linux-nextrepositório todos os dias, acumulará um grande número dessas tags de ramificação antigas.
Se você excluir uma série inteira e executar git-gc, a operação levará um bom tempo e o número de blocos e inodes usados ​​crescerá significativamente.

Eles desaparecerão após um " git prune", mas quando eu faço essa operação de limpeza, muitas vezes desejei uma --yes-I-know-what-I-am-doing-and-it's-unsafe-but-just-drop-the-unreachable-objects-cause-this-is-just-a-tracking-repositoryopção para "git gc".

Então, no seu caso, um " git prune" seria útil?

(possivelmente usando "now" na gc.pruneexpirevariável de configuração, necessária para que o comportamento acima ocorra).


Você também tem (do mesmo segmento):

repack -a -d -l

Observe a letra minúscula 'a'.

git-gcchama reembalar com 'A' maiúsculo, que é o que faz com que os objetos inacessíveis sejam descompactados. O pequeno 'a' é para pessoas que sabem o que estão fazendo e querem que o git simplesmente solte objetos inacessíveis.

VonC
fonte
1
'git ameixa' provavelmente resolveria meu problema imediato - tentarei mais tarde hoje. No entanto, eu gosto do aspecto de segurança de manter os objetos soltos por duas semanas, caso eu queira voltar e examinar algumas revisões antigas, para que eu realmente não goste desta solução. Não estou tendo nenhum problema com o tamanho ou o desempenho do git, é apenas o 'git gui' que insiste em me pedir para compactar o banco de dados, mesmo quando compactá-lo não teria efeito.
22611 Michael Donohue
comentário muito útil. Essa mensagem irritante de "objeto solto" estava ficando realmente irritante. De onde vem essa contagem? A saída do git-fsck, talvez?
11119 David Dombrowsky
obrigado - eu também tinha objetos soltos que o git gc não estava removendo - git ameixa era a resposta.
Shedd
Fiz uma remoção do git fora de qualquer repositório e isso esclareceu alguns dos objetos. Então entrei no repositório de problemas e fiz uma remoção do git e todos os problemas desapareceram.
Nicholas Orlowski
"git prune" resolve o problema que o OP (e eu) tivemos: "Eu fiz isso antes e reduz os objetos soltos para cerca de 250, mas isso não suprime o pop-up".
Eike
32

Quando o pop-up "Loose Object" sei que é hora de executar o coletor de lixo do git:

git gc

Depois disso, o pop-up desaparece.

Atualização: (devido à sugestão do TED)

, extraí a rotina abaixo de git/share/git-gui/lib/database.tcl
Você pode modificá-la para atender às suas necessidades.

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
        }
    }
}
Nick Dandoulakis
fonte
1
Clicar em OK na caixa de diálogo não faz exatamente isso? Se o GC não se livrasse de todos os objetos soltos, ele ainda conseguiria o diálogo.
TED
Cliquei em 'OK' e executei 'git gc' na linha de comando - ambos me levam até 250, mas fazê-lo novamente não faz mais nenhum progresso.
227 Michael Donohue
3
Eu sei que é estranho, mas limpar a base da GUI às vezes deixa objetos soltos. Fecho o gui, corro git-gc e todo o lixo se acaba.
9119 Nick Dandoulakis
3
Alterar o tcl corrige - eu apenas aumentei o limite do Windows para 10 * 250. Obrigado!
22611 Michael Donohue
para mim, correr a git gcpartir da linha de comando resolveu o problema ... basta clicar okem git gui de alguma forma não funcionou ...
raphael
3

Hmmmm .... não vejo um argumento de linha de comando para isso nos documentos .

Suponho que você sempre pode obter a fonte, retirar o código da caixa de diálogo e reconstruir.

TED
fonte