Conforme mencionado na publicação no blog de Mark Longair, Git Submodules Explained ,
As versões 1.7.0 e posteriores do git contêm uma alteração irritante no comportamento do submódulo git.
Os submódulos agora são considerados sujos se tiverem arquivos modificados ou não rastreados , enquanto anteriormente só seria o caso se HEAD no submódulo apontasse para a confirmação incorreta.
O significado do sinal de mais ( +
) na saída do submódulo git mudou, e na primeira vez que você se deparar com isso, leva um tempo para descobrir o que está acontecendo de errado, por exemplo, olhando através de registros de alterações ou usando git bisect no git .git para encontrar a alteração. Teria sido muito mais gentil com os usuários introduzir um símbolo diferente para "na versão especificada, mas suja".
Você pode corrigi-lo:
confirmando ou desfazendo as alterações / evoluções em cada um dos seus submódulos, antes de voltar ao repositório pai (onde o diff não deve mais relatar arquivos "sujos"). Para desfazer todas as alterações no seu submódulo apenas cd
no diretório raiz do submódulo e fazergit checkout .
O dotnetCarpenter comenta que você pode fazer um:git submodule foreach --recursive git checkout .
ou adicione --ignore-submodules
ao seu git diff
, para ignorar temporariamente esses submódulos "sujos".
Novo no Git versão 1.7.2
Como Noam comenta abaixo , esta pergunta menciona que, desde a versão 1.7.2 do git, você pode ignorar os submódulos sujos com:
git status --ignore-submodules=dirty
git commit -a
sem ter que se preocupar em adicionar essas alterações. Embora estejam marcados comM
na frente, eles não acabarão no seu commit.git clean -id
.git submodule foreach --recursive git clean -id
(a ser testado em um repo primeiro backup;)).gitignore
. Adicioná-los lá ou à minha lista global de ignorados corrigidos.Também remover o submódulo e depois executar
git submodule init
egit submodule update
obviamente fará o truque, mas nem sempre é apropriado ou possível.fonte
Para ignorar todos os arquivos não rastreados em qualquer submódulo, use o seguinte comando para ignorar essas alterações.
Ele adicionará a seguinte opção de configuração à sua configuração local do git:
Mais informações podem ser encontradas aqui
fonte
EDIT : Esta resposta (e a maioria das outras) são obsoletas; veja a resposta de Devpool .
Originalmente, não havia opções de configuração para tornar "
git diff --ignore-submodules
" e "git status --ignore-submodules
" o padrão global (mas consulte também Configurando sinalizadores padrão do git nos comandos ). Uma alternativa é definir umaignore
opção de configuração padrão em cada sub-módulo individual que você deseja ignorar (para ambosgit diff
egit status
), no.git/config
arquivo (somente local) ou.gitmodules
(será versionado pelo git). Por exemplo:ignore = untracked
ignorar apenas arquivos não rastreados,ignore = dirty
também ignorar arquivos modificados eignore = all
ignorar também confirma. Aparentemente, não há como curinga para todos os submódulos.fonte
Esse é o caso, porque o ponteiro que você possui para o submódulo não é o que realmente está no diretório do submódulo. Para corrigir isso, você deve executar
git submodule update
novamente:fonte
Isso não funcionou para mim, mas me deu uma lista de arquivos (no meu caso, apenas um) que foram alterados no submódulo (sem eu fazer nada lá).
Então, eu poderia ir para o submodule e o status do git me mostrou que meu HEAD estava desconectado -> git checkout master, git status para ver o arquivo modificado mais uma vez, git checkout> filename <, git pull e tudo bem novamente.
fonte
Acabei removendo o diretório do submódulo e inicializando-o novamente
fonte
Um submódulo pode ser marcado como sujo se as configurações do modo de arquivo estiverem ativadas e você tiver alterado as permissões de arquivo na subárvore do submódulo.
Para desativar o modo de arquivo em um submódulo, você pode editar /.git/modules/path/to/your/submodule/config e adicionar
Se você deseja ignorar todos os estados sujos, pode definir a
ignore = dirty
propriedade no arquivo /.gitmodules , mas acho melhor desativar apenas o modo de arquivo.fonte
No meu caso, eu não tinha certeza do que havia causado isso, mas sabia que só queria que os submódulos fossem redefinidos para o último commit remoto e terminados. Isso envolveu a combinação de respostas de algumas perguntas diferentes aqui:
git submodule update --recursive --remote --init
Fontes:
Como reverto minhas alterações para um submódulo git?
Maneira fácil de obter o mais recente de todos os submódulos git
fonte