Git: posso suprimir a listagem de 'conteúdo modificado' / entradas de sub-módulos sujos em status, diff, etc.?

123

Em algum momento (em torno das versões 1.6.x, eu acho), o git ficou ciente das mudanças dentro dos submódulos. Isso só serve para me irritar:

fornecedor de status $ git | grep modificado:
# modificado: fornecedor / rails (conteúdo modificado)
Fornecedor do $ git diff /
diff --git a / vendor / rails b / vendor / rails
--- a / vendor / trilhos
+++ b / fornecedor / trilhos
@@ -1 +1 @@
Confirmação de sub-projeto 046c900df27994d454b7f906caa0e4226bb42b6f
+ Subprojeto de confirmação 046c900df27994d454b7f906caa0e4226bb42b6f-dirty

Por favor, faça parar?

Editar:

Ok, então eu tenho uma resposta. Agora eu tenho outra pergunta:

Posso colocar isso ~/.gitconfig? Pela minha inicial, parece que não posso, e não vi nada promissor ao deslizar o patch. (Acho que ainda posso criar um alias.)

kch
fonte
Vejo alguns patches na lista de discussão do git sobre isso, datada de junho de 2010. Portanto, espero que esteja em um próximo lançamento. (google for 'git "--ignore-submodules = dirty"')
kch
+1 para explicar por que a mensagem ocorre!
dotancohen

Respostas:

175

Existe ainda a possibilidade de definir o modo de ignorar para cada sub-módulo adicionado no arquivo .gitmodules.

Ainda hoje encontrei esse problema e escrevi imediatamente um artigo no meu blog sobre ele, depois de encontrar uma solução: Como ignorar alterações nos submódulos git

A essência disso:

Depois de adicionar um submódulo, haverá um arquivo nomeado .gitmodulesna raiz do seu repositório

Basta adicionar uma linha a esse .gitmodulesarquivo:

[submodule "bundle/fugitive"]
    path = bundle/fugitive
    url = git://github.com/tpope/vim-fugitive.git
    ignore = dirty
NilsHaldenwang
fonte
5
+1, mas incluí a parte principal do seu blog na sua resposta no SO: seu link externo pode se tornar inválido um dia, em oposição às respostas do SO que permanecerão para sempre (através dos despejos do SO: blog.stackoverflow.com/2009/ 06 /… )
VonC
5
Descobri que precisava confirmar o arquivo .gitmodules antes de git statusfuncionar como esperado. Além disso, você precisa de pelo menos 1.7.4 ou melhor, eu acredito.
aleemb 24/07
Para o .gitignorearquivo, existe uma versão privada chamada exclude, localizada em .git/info/, que não é manipulada. Existe um arquivo correspondente para o .gitmodulesarquivo, que permitirá suprimir alterações no submódulo apenas na sua instância do repositório pai, sem fazer alterações .gitmodules?
HelloGoodbye 28/08
2
Não consigo fazer isso funcionar com um submódulo que rastreia uma ramificação. Não é suportado para isso? `` [submodule "smstack / ansible / hosts"] caminho = smstack / ansible / hosts url = https: // ... branch = master ignore = dirty `` `` ``
Marc Abramowitz
1
@ MarcAbramowitz Eu me deparei com o mesmo problema que eu acho - você encontrou alguma solução para isso?
Sebastian G. Marinescu
61

Existem dois tipos de avisos de alteração que você pode suprimir.

O primeiro é o untracked contentque acontece quando você faz alterações no seu submódulo, mas ainda não as confirmou. O repositório pai os nota e os git statusrelata de acordo:

modified: modules/media (untracked content)

Você pode suprimi-los com:

[submodule "modules/media"]
   path = modules/media
   url = [email protected]:user/media.git
   ignore = dirty

No entanto, depois de confirmar essas alterações, o repositório pai mais uma vez notará e as reportará de acordo:

modified:   modules/media (new commits)

Se você também deseja suprimi-las, precisa ignorar as allalterações

[submodule "modules/media"]
   path = modules/media
   url = [email protected]:user/media.git
   ignore = all
aleemb
fonte
2
Para o .gitignorearquivo, existe uma versão privada chamada exclude, localizada em .git/info/, que não é manipulada. Existe um arquivo correspondente para o .gitmodulesarquivo, que permitirá suprimir alterações no submódulo apenas na sua instância do repositório pai, sem fazer alterações .gitmodules?
HelloGoodbye 28/08
1
HelloGoodbye: Se você marcar .git / modules / $ MODULENAME /, verá o que parece ser o diretório .git desse módulo. Alterar o arquivo de informações / exclusão nesse local faz o trabalho.
23915 PaulWW
1
A ignore = allparte é útil.
Eric Wang
53

Atualização: Veja (e vote ) a resposta de nilshaldenwang sobre a possibilidade de adicionar ao .gitmodulesarquivo um parâmetro de configuração para ignorar o estado sujo de um determinado sub-módulo.

ignore = dirty

Então o git 1.7.2 foi lançado e inclui a --ignore-submodulesopção for status.

De git help status:

--ignore-submódulos [= <quando>]
    Ignore as alterações nos submódulos ao procurar alterações.
    <when> pode ser "não rastreado", "sujo" ou "todos", o que
    é o padrão. Quando "não rastreado" é usado, os submódulos são
    não é considerado sujo quando contém apenas não rastreados
    conteúdo (mas eles ainda são verificados quanto ao conteúdo modificado).
    Usar "sujo" ignora todas as alterações na árvore de trabalho de
    submódulos, apenas alterações nos commits armazenados no
    superprojeto são mostrados (esse era o comportamento antes
    1.7.0). O uso de "all" oculta todas as alterações nos submódulos (e
    suprime a saída dos resumos do submódulo quando o
    opção de configuração status.submodulesummary está definida).

O valor que eu quero é dirty.

git status --ignore-submodules=dirty

Eu uso um alias porque sou preguiçoso:

alias gst='git status --ignore-submodules=dirty'
kch
fonte
2
Como essa é uma resposta aceita, acho que você também deve adicionar a opção de adicionar ignore=dirtyentradas individuais no .gitmodulesarquivo aqui.
Andriy Drozdyuk
14

Como você mencionou, o submódulo do patch git: ignorar submódulos sujos para resumo e status está em construção.

Também anunciado no Git 1.7.2-rc2 :

Git v1.7.2 Release Notes (draft)
================================

Updates since v1.7.1
--------------------

opção " git status" aprendida " --ignore-submodules".

Significado:

git config --global diff.ignoreSubmodules dirty

Considerar isso como uma opção não é exatamente o abordagem escolhida no momento :

Após esta série, pretendo adicionar uma opção de configuração 'ignore ' a .gitmodules, que pode ser definida para cada sub-módulo como "todos", "sujos", "não rastreados" ou "nenhum" (o padrão).

" git diff" e " git status" usarão esse valor de configuração para cada submódulo.
O uso de " --ignore-submodule" substitui esse padrão (e o novo parâmetro "nenhum" será adicionado lá para substituir as configurações).

E para evitar ter que fazer " git submdule sync" toda vez que essa opção for alterada, eu gostaria de procurá-la em.git/config primeiro.
Se não for encontrado lá, será retirado .gitmodules, se presente.

Assim, os usuários podem substituir a configuração, mas se não o fizerem, a montante poderá alterá-la facilmente (por exemplo, quando um submódulo .gitignorefoi atualizado para que " ignore=untracked" não seja mais necessário e possa ser removido).
A troca de ramificações também terá efeito instantâneo se a ignoreentrada ' ' .gitmodulesfor diferente entre as ramificações.


Outra abordagem para tornar o status do git (ou qualquer comando git) para ignorar um sub-módulo específico está disponível no Git 2.13 (Q2 2017):

git config submodule.<name>.active false

Veja mais em " Ignorar novas confirmações para o submódulo git ".

VonC
fonte
Atualizei a pergunta com um bit gitconfig. Basta executar o ping para saber a resposta.
kch
@kch: Atualizei a resposta com a abordagem atualmente proposta para armazenar esse tipo de configuração.
VonC
@drozzy: como você mencionou em seu outro comentário: " ignore = dirty"
VonC
1
@drozzy: Voto e completei a resposta de nilshaldenwang com o parâmetro de configuração adicional "ignore = dirty", editei a resposta oficial, adicionando um link à postagem de nilshaldenwang.
VonC
Obrigado, nada pessoal, mas eu só queria a resposta mais útil, que inicialmente eu perdi!
Andriy Drozdyuk
11

Você também pode usar

% git config [--global] submodule.ignore dirty

para definir submodule.ignore = dirtyem seu .git/configarquivo. --globalirá definir o sinalizador de ignorar no seu ~/.gitconfige aplicar a todos os seus repositórios. Sem ele, ele deve ser definido .git/configapenas para o repo em que você está atualmente.

A única documentação que posso encontrar sobre isso está submodule.<name>.ignorenos documentos do git-config . Mudei-o de um arquivo .gitmodules para o meu ~ / .gitconfig e ainda está funcionando para mim.

kjell_
fonte
@ PawełGościcki Posso confirmar que funciona no Git 2.0.0.
Ciro Santilli publicou em 01/04/19
6

Você precisa adicionar

ignorar = sujo

para .gitmodules

romano
fonte
Em quais módulos .git você o adiciona?
Andriy Drozdyuk
@drozzy Você o adiciona na seção para cada submódulo que você deseja ignorar, onde os valores "caminho" e "url" são definidos.
jsdalton
2

Então o git v1.7.2-rc2 tem o que eu quero:

$ git diff --ignore-submodules = fornecedor sujo
# sem saída
$ git status --ignore-submodules = fornecedor sujo
# Na filial ...
nada a confirmar (diretório de trabalho limpo)

Construindo seu próprio howit do git:

# get git
git clone git://git.kernel.org/pub/scm/git/git.git git
cd git
git checkout v1.7.2-rc2

# make git. beware of setting prefix
make configure
./configure --prefix=/usr/local
make
sudo make install

# you REALLY don't want to `make doc`, use this instead
sudo make quick-install-man
sudo make quick-install-html
kch
fonte
1
Conto gits sete aqui: git clone git://git.kernel.org/pub/scm/git/git.git git.
dotancohen
2

Eu respondi a essa pergunta aqui com mais detalhes.

Apenas corra

git config --global diff.ignoreSubmodules dirty

para adicionar uma opção de configuração local para ignorar essas alterações.

Devpool
fonte
1

Você não pode querer adicionar ignore = dirtya .gitmodules, você pode querer ser mais seletivo sobre as mudanças que queriam ignorar.

Para fazer isso, adicione padrões a .git/submodule_foo/bar/info/exclude, onde submodule_foo/bar/está o caminho do submódulo.

Os padrões são semelhantes aos padrões aos quais você adicionaria .gitignore, com a raiz sendo o diretório do submódulo. Por exemplo, esse padrão ignora o builddiretório no submódulo submodule_foo/bar/:

# in .git/submodule_foo/bar/info/exclude:
/build/
Flimm
fonte
3
Eu acho que isso ocultará as alterações também quando dentro de um submódulo. Eu quero apenas as alterações ocultas quando estiver fora do submódulo. Tudo bem se eles aparecerem quando estiver dentro, quando eu estiver trabalhando ativamente no submódulo.
Raphael Schweikert