Você ignora um submódulo git em seu .gitignore ou o envia para seu repo?

95

Eu adicionei um submódulo ao meu projeto project_dir/vendor/submodule_oneagora sempre que executo git status, recebo modified: vendor/submodule_one (new commits).

Minha dúvida é qual a melhor maneira de lidar com isso? Devo adicionar a vendor/submodule_one-pasta ao meu, .gitignorepois meu projeto principal não deve precisar saber sobre as especificações do meu submódulo?

Ou quando estou alterando e fazendo commit de alterações em meu submódulo, eu preciso fazer commits em meu projeto principal também?

Acabei de começar com os submódulos e não conseguia encontrar muitas informações além de configurá-los.

sprysoft
fonte

Respostas:

82

Não, você não precisa adicionar seu submódulo ao seu .gitignore: o que o pai verá do seu submódulo é um gitlink (uma entrada especialmode 160000 ).

Isso significa: qualquer mudança feita diretamente em um submódulo precisa ser seguida por um commit no diretório pai.
Dessa forma, o diretório pai gravará o commit correto para o estado do submódulo: Esse commit é o "gitlink" mencionado acima;

Você pode ler mais sobre essa política em " git submodule update (true nature of submodules) ".
A ideia principal por trás dos submódulos é uma abordagem baseada em componentes , onde você faz referência a outros repos em commits específicos. Mas se você alterar alguma coisa nesses submódulos, também precisará atualizar essas referências no repositório pai.


Observe que com Git 2.13 (2º trimestre de 2017), embora não ignore o gitlink, você ainda pode ignorar o submódulo com:

git config submodule.<name>.active false

Veja mais em " Ignorar novos commits para o submódulo git ".


Nota: com Git 2.15.x / 2.16 (Q1 2018), ignorar um submódulo é mais preciso.
" git status --ignored --untracked" não parou em uma árvore de trabalho de um projeto separado que está embutido em um diretório ignorado e arquivos listados nesse outro projeto, em vez de apenas mostrar o próprio diretório como ignorado.

Consulte commit fadb482 (25 de outubro de 2017) por Johannes Schindelin ( dscho) .
(Incorporado por Junio ​​C Hamano - gitster- no commit da7996a , 06 de novembro de 2017)

status: não se confunda com submódulos em diretórios excluídos

Passamos meticulosamente o excludesinalizador para a treat_directory()função para que possamos indicar que os arquivos nele são excluídos em vez de não rastreados quando recorrem.

Mas ainda não tratamos os submódulos da mesma maneira.

Por causa disso, git status --ignored --untrackedcom um submódulo submoduleem um gitignored tracked/mostraria o submódulo na seção " Untracked files", por exemplo

On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    tracked/submodule/

Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/initial.t

Em vez disso, gostaríamos de mostrar o submódulo na seção " Ignored files":

On branch master
Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/
VonC
fonte
1
Obrigado VonC, faz todo o sentido quando você coloca dessa forma.
sprysoft
10
Essa resposta é confusa porque o título da pergunta pergunta se você deve ignorar as pastas de submódulo ou não, e você está respondendo sim a uma pergunta separada posteriormente no corpo da pergunta.
SgtPooki
1
Acho que faz muito mais sentido agora e está fornecendo algumas informações detalhadas muito úteis. Incrível, obrigado por atualizar :)
SgtPooki
Argumento para .gitignore: Por que fazer check-in do arquivo .gitsubmodules quando o url nele contido pode conter um url git específico do usuário com um parâmetro de nome de usuário?
Djangofan
1
@djangofan a pergunta (e minha resposta) era sobre ignorar a própria pasta de submódulo (aquela representada por um gitlink). Não sobre ignorar o .gitmodulesarquivo. É verdade que esse arquivo (o .gitmodules) pode incluir credenciais, mas se usado apenas para clonar repositórios públicos, não é necessário incluí-los. Além disso, eles podem ser armazenados em cache de qualquer maneira, mesmo no Windows, com ajudantes de credencial como o "Git Credential Manager for Windows" ( github.com/Microsoft/Git-Credential-Manager-for-Windows/… ). Portanto, ter credenciais no .gitmodulesnão é uma fatalidade.
VonC de
8

Por algum motivo, submodule.module-name.active não funcionou para mim.

É por isso que usei submodule.module-name.ignore

git config submodule.<your module path>.ignore all

https://git-scm.com/docs/gitmodules - aqui você pode encontrar a descrição dos valores possíveis para o parâmetro

Funciona para mim para (novos commits) e (conteúdo modificado) mensagens.

Vladimir
fonte
1

Para complementar a resposta aceita, descobri que adicionar a pasta do submódulo Git a .gitignore causa problemas - principalmente ao tentar criar um novo clone do projeto. Especificamente, a execução dos comandos normais de clone do submódulo resultou na pasta do submódulo vazia:

git submodule init
git submodule update
git pull --recurse-submodules

Apenas tentando executar novamente

git submodule add <Git repo> <submodule folder>

estava claro qual era o problema, com base na saída:

The following path is ignored by one of your .gitignore files:
<submodule folder>
Use -f if you really want to add it.

Em vez de adicionar -f, removi a pasta do submódulo Git de .gitignore e executei novamente os comandos clone do submódulo - que agora criaram a pasta com sucesso. Acho que pode haver um bug em que um dos comandos de clone do submódulo respeita .gitignore, mas não avisa que está pulando um submódulo de acordo.

Woodz
fonte