Como se livrar do status não rastreado dos sub-módulos do Git?

149

Não consigo me livrar do conteúdo não rastreado nos submódulos do Git. git statusRendimentos em execução :

# No mestre da filial
# Alterações não preparadas para confirmação:
# (use "git add ..." para atualizar o que será confirmado)
# (use "git checkout - ..." para descartar alterações no diretório de trabalho)
# (confirmar ou descartar o conteúdo não rastreado ou modificado nos submódulos)
#
# modificado: pacote / snipmate (conteúdo não rastreado)
# modificado: pacote / surround (conteúdo não rastreado)
# modificado: pacote / espaço em branco à direita (conteúdo não rastreado)
# modificado: pacote / zencoding (conteúdo não rastreado)
#
nenhuma alteração adicionada ao commit (use "git add" e / ou "git commit -a")

A adição do --ignore-submodulesparâmetro oculta essas mensagens; mas me pergunto se existe uma maneira de se livrar dessa sujeira de uma maneira mais adequada e essencial.

Tomer Lichtash
fonte
3
Esta resposta: stackoverflow.com/a/5127213/199649 evoca mais opções.
charlax

Respostas:

95

Como o status do git relata conteúdo não rastreado, a maneira real de ter um status limpo seria entrar em cada um desses submódulos e:

  • adicione e confirme o conteúdo não rastreado,
  • ou referencie o conteúdo não rastreado em um .gitignoreespecífico para cada módulo.
  • ou você pode adicionar o mesmo conteúdo ignorado ao submódulo .git/info/exclude, como o peci1 relata nos comentários .
  • ou adicionar sujo com a especificação submódulo, como mencionado em ezraspectre de resposta (upvoted).

    git config -f .gitmodules submodule.<path>.ignore untracked
    
  • ou adicione um global .gitignore arquivo (geralmente ~/.gitignore-global). Como por exemplo .DS_Storeou no meu caso, Carthage/Buildcomo relatado por Marián Černý nos comentários . Veja a .gitginorepágina de manual :

Os padrões que um usuário deseja que o Git ignore em todas as situações (por exemplo, arquivos de backup ou temporários gerados pelo editor preferido do usuário) geralmente entram em um arquivo especificado por core.excludesFile ele ~/.gitconfig. Seu valor padrão é $XDG_CONFIG_HOME/git/ignore. Se $XDG_CONFIG_HOMEnão estiver definido ou vazio, $HOME/.config/git/ignoreserá usado.

VonC
fonte
5
+1, eu estava prestes a gritar até encontrar isso ... depois de perceber que um .DS_Storearquivo havia sido criado automaticamente (pelo OS X) em um dos meus submódulos, impedindo-me de comprometer o projeto principal. Arg! Hora de atualizar .gitignore...
Courtney Christensen
Usando o Xcode, também achei útil adicionar * .xcuserdatad ao arquivo .gitignore-global. Isso evita que o git tente rastrear as preferências locais do Xcode.
Roy Sharon
Se você não possui direitos de envio para o submódulo, não poderá compartilhar suas alterações no submódulo com outros usuários do repositório pai. A solução da @ quincyglenn parece funcionar nesse caso.
de Drew Noakes
1
@VonC, qualquer resposta faz sentido, dependendo da situação e preferência. Eu queria destacar a distinção aqui como uma referência para os outros. BTW, obrigado por suas muitas respostas sobre o Git aqui no SO - você me ajudou muitas vezes.
de Drew Noakes
2
Você pode fazer isso sem comprometer e criar um .gitignore (que não é rastreado). Abra o submódulo .git/info/excludee adicione as linhas de ignorar (ele funciona como um .gitignore, mas não faz parte do repositório compartilhado).
Martin Pecka
144

Eu encontrei este post para trabalhar em geral. Adicionando a ignore = dirtyopção a cada uma das entradas no .gitmodulesarquivo.

[submodule "zen-coding-gedit3"]
    path = zen-coding-gedit3
    url = git://github.com/leafac/zen-coding-gedit3.git
    ignore = dirty
ezraspectre
fonte
Minha solução preferida, pois é facilmente automatizada.
Lethal-guitar
24
Vale ressaltar que ignore = untrackedtambém existe e mostra arquivos rastreados modificados, mas não arquivos não rastreados. Seria bom se houvesse uma configuração global para isso para todos os submódulos ...
naught101 27/11/2015
12

Você também pode ir para cada diretório do submódulo e atuar como um git separado. Por exemplo:

cd my/project/submodule
git status

... / obtém a lista de arquivos modificados /

git add .  //to add all of them to commit into submodule
git commit -m "message to your submodule repo"

você também pode atualizar seu repositório de submódulo remoto com

git submodule update

depois de tudo

Ricardo Martins
fonte
5
Você provavelmente não quer fazer isso git add .sem revisar os arquivos modificados. Na maioria das vezes, as alterações feitas são os .DS_Storearquivos adicionados - isso provavelmente deve ser detectado pelo seu .gitignore, como zourtney mencionou no primeiro comentário à resposta.
gregoltsov
Caso você realmente não deseje atualizar os submódulos e desejar reverter para o estado original, convém executar git submodule update --force.
Tom
4

Pode ser devido à detached HEADramificação do seu submódulo. Se for esse o caso, entre no caminho do submódulo (por exemplo:) ./bundle/snipmatee execute git checkout master.

Browny Lin
fonte
2

Ontem fiquei preso nessa questão, em um projeto que tinha quase 12 submódulos.

git status estava mostrando a saída.

# On branch master
# Changes not staged for commit:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#
#   modified:   proj1 (untracked content)
#   modified:   proj1 (modified content, untracked content)
#   ...

Para resolver o erro de conteúdo untracked, eu tive que remover os arquivos untracked de todos os sub-módulos (todos eram *.pyc, *.pyoarquivos gerados por python) usando um .gitignore.

Para resolver o outro, tive que executar o git submodule updateque atualizou cada um dos submódulos.

mu 無
fonte
1

Na minha situação, clono módulos como ponto de partida para um novo módulo no meu ambiente ZF2. O que isso faz é colocar sua própria pasta .git no diretório

A solução nesse caso é excluir a pasta .git (você provavelmente precisará mostrar os arquivos ocultos para visualizá-la).

HappyCoder
fonte
1

Isso provavelmente acontece quando você tem outro .git [pasta oculta] dentro da pasta específica.

modificado: ./../ .. (conteúdo modificado, conteúdo não rastreado)

verifique se o subdiretório não contém essa pasta .git.

Se for esse o caso, o problema pode ser resolvido excluindo a pasta .git manualmente do subdiretório.

Subrat Kumar Palhar
fonte
1

Eu prefiro usar o SourceTree , a solução para mim foi abrir o repositório do submódulo no SourceTree, que me mostra uma lista de todos os arquivos não rastreados. Em seguida, agrupei os selecionados e usei "Remover".

Consegui fazer isso porque sabia que todos os arquivos não rastreados não eram realmente necessários.

Glenn Lawrence
fonte
1

Isso funcionou muito bem para mim:

git update-index --skip-worktree <path>

Se não funcionar com o pathname, tente o nome do arquivo. Deixe-me saber se isso funcionou para você também.

DarkCrazy
fonte
-1

Se esse for um problema temporário, você poderá ir para a pasta do submódulo e executar, git reset HEAD --hardmas perderá todas as alterações dentro do submódulo.

daigo
fonte