Veja abaixo a linha sólida da minha pergunta original.
Eu tenho uma pasta no meu diretório local que não é rastreada. Quando corro git status
, recebo:
Changed but not updated:
modified: vendor/plugins/open_flash_chart_2 (modified content, untracked content)
Quando digito git add vendor/plugins/open_flash_chart_2
e tento git status
novamente, ele ainda diz não rastreado. O que está acontecendo?
Aqui está um resumo simples da minha última meia hora:
Descobri que meu repositório do Github não está rastreando meu
vendor/plugins/open_flash_chart_2
plug-in. Especificamente, não há conteúdo e está mostrando uma seta verde no ícone da pasta.Tentou
git submodule init
No submodule mapping found in .gitmodules for path 'vendor/plugins/open_flash_chart_2'
Tentou
git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
vendor/plugins/open_flash_chart_2 already exists in the index
git status
modified: vendor/plugins/open_flash_chart_2 (untracked content)
Caçado por qualquer arquivo nomeado
.gitmodules
no meu diretório repositório / local, mas não consegui encontrar um.
O que preciso fazer para que meus submódulos funcionem para que o git possa começar a rastrear corretamente?
Isso pode não estar relacionado (eu o incluo no caso de ajudar), mas toda vez que digito, em git commit -a
vez do normal git commit -m "my comments"
, gera um erro:
E325: ATTENTION
Found a swap file by the name ".git\.COMMIT-EDITMSG.swp"
dated: Thu Nov 11 19:45:05 2010
file name: c:/san/project/.git/COMMIT_EDITMSG
modified: YES
user name: San host name: San-PC
process ID: 4268
While opening file ".git\COMMIT_EDITMSG"
dated: Thu Nov 11 20:56:09 2010
NEWER than swap file!
Swap file ".git\.COMMIT_EDITMSG.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:
Swap file ".git\.COMMIT_EDITMSG.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:
Eu sou um novato completo no Github e, apesar de tentar ler a documentação, estou um pouco perplexo com esses problemas específicos. Obrigado.
fonte
git submodule add
,git submodule update --init
.tracking
tag parece ser usada para os tópicos 'rastreamento de visitantes do site', para que também não se aplica.Respostas:
Você adicionou
vendor/plugins/open_flash_chart_2
como entrada "gitlink", mas nunca a definiu como um submódulo. Efetivamente, você está usando o recurso interno que o sub-módulo git usa (entradas gitlink), mas não está usando o próprio recurso do sub-módulo.Você provavelmente fez algo assim:
Este último comando é o problema. O diretório
vendor/plugins/open_flash_chart_2
começa como um repositório Git independente. Normalmente, esses sub-repositórios são ignorados, mas se você disser ao git add para adicioná-lo explicitamente, ele criará uma entrada gitlink que aponta para o commit HEAD do sub-repositório, em vez de adicionar o conteúdo do diretório. Pode ser bom se o git add se recusar a criar esses "semi-módulos".Diretórios normais são representados como objetos de árvore no Git; os objetos em árvore dão nomes e permissões aos objetos que eles contêm (geralmente outros objetos em árvore e blob - diretórios e arquivos, respectivamente). Os submódulos são representados como entradas "gitlink"; As entradas gitlink contêm apenas o nome do objeto (hash) da confirmação HEAD do submódulo. O “repositório de origem” para a confirmação de um gitlink é especificado no
.gitmodules
arquivo (e no.git/config
arquivo após a inicialização do submódulo).O que você tem é uma entrada que aponta para uma confirmação específica, sem registrar o repositório de origem para essa confirmação. Você pode corrigir isso transformando seu gitlink em um submódulo adequado ou removendo o gitlink e substituindo-o por conteúdo "normal" (arquivos simples e diretórios).
Transforme-o em um submódulo adequado
O único bit que está faltando para definir corretamente
vendor/plugins/open_flash_chart_2
como um submódulo é um.gitmodules
arquivo. Normalmente (se você ainda não o incluiu como entrada simples no gitlink), basta usargit submodule add
:Como você encontrou, isso não funcionará se o caminho já existir no índice. A solução é remover temporariamente a entrada gitlink do índice e adicionar o submódulo:
Isso usará seu sub-repositório existente (ou seja, não re-clonará o repositório de origem) e preparará um
.gitmodules
arquivo parecido com este:Também fará uma entrada semelhante no repositório principal
.git/config
(sem apath
configuração).Confirme isso e você terá um submódulo adequado. Ao clonar o repositório (ou enviar para o GitHub e clonar a partir daí), você poderá reinicializar o submódulo via
git submodule update --init
.Substitua-o por conteúdo simples
A próxima etapa pressupõe que seu sub-repositório
vendor/plugins/open_flash_chart_2
não possua nenhum histórico local que você queira preservar (ou seja, tudo o que importa é a árvore de trabalho atual do sub-repositório, não o histórico).Se você possui histórico local no sub-repositório de seu interesse, faça backup do
.git
diretório do sub-repositório antes de excluí-lo no segundo comando abaixo. (Considere também o exemplo da subárvore git abaixo que preserva o histórico do HEAD do sub-repositório).Desta vez, ao adicionar o diretório, ele não é um sub-repositório; portanto, os arquivos serão adicionados normalmente. Infelizmente, como excluímos o
.git
diretório, não há uma maneira super fácil de manter as coisas atualizadas com o repositório de origem.Você pode considerar usar uma mesclagem de subárvore . Fazer isso permitirá que você puxe facilmente as alterações do repositório de origem, mantendo os arquivos "planos" no seu repositório (sem sub-módulos). O comando git subtree de terceiros é um bom invólucro em torno da funcionalidade de mesclagem de subárvores.
Mais tarde:
A subárvore git também tem uma
--squash
opção que permite evitar a incorporação do histórico do repositório de origem no seu histórico, mas ainda permite que você faça mudanças iniciais.fonte
rm -rf vendor/plugins/open_flash_chart_2/.git
e diz 'rm' não é reconhecido. Então eu tenteigit rm -rf vendor/plugins/open_flash_chart_2/.git
e dissefatal: pathspec 'vendor/plugins/open_flash_chart_2/.git' did not match any files
(mas eu posso chegar lá no Windows Explorer!)..git
diretório do sub-repositório e adicionar novamente os arquivos “sem rodeios” (a primeira opção “Conteúdo Simples”).subtree
não deve ser confundido com a mesclagem de subárvores. Não é um invólucro. O autor diz que: Pgit readtree --prefix=path
e a subárvore mescla:git merge
com-s subtree
ou-Xsubtree=path
). Também possui ótimos extras "on top":--squash
mode, thesplit
commandpush
epull
thee helpers.Eu apenas tive o mesmo problema. O motivo foi porque havia uma subpasta que continha uma pasta ".git". Removê-lo fez o git feliz.
fonte
.git
pastaURL de referência https://danielmiessler.com/blog/git-modified-untracked/#gs.W0C7X6U
fonte
Para apontar o que eu tive que descobrir da conversa de Chris Johansen com o OP (vinculada de uma resposta a uma resposta):
git add vendor/plugins/open_flash_chart_2
# adicionará gitlink, o conteúdo não será rastreadogit add vendor/plugins/open_flash_chart_2/
# AVISO A BARRA !!!!O segundo formulário o adicionará sem o gitlink, e o conteúdo é rastreável. O diretório .git é conveniente e automaticamente ignorado. Obrigado Chris!
fonte
Eu uso o truque sugerido por Peter Lada o tempo todo, apelidado de "submódulos falsos":
http://debuggable.com/posts/git-fake-submodules:4b563ee4-f3cc-4061-967e-0e48cbdd56cb
É muito útil em vários cenários (por exemplo, eu o uso para manter toda a minha configuração do Emacs em um repositório, incluindo o HEAD atual de todos os repositórios git dentro dos diretórios de pacote elpa / el-get, para que eu possa reverter / retroceder facilmente para um conhecido versão de trabalho quando alguma atualização quebra algo).
fonte
http://progit.org/book/ch6-6.html
Eu acho que você deveria ler isso para aprender um pouco sobre o submódulo. Está bem escrito e não leva muito tempo para lê-lo.
fonte
Eu tive o mesmo problema com um grande projeto com muitos submódulos. Com base nas respostas de Chris Johnsen aqui e VonC aqui , construo um script bash curto que itera através de todas as entradas existentes do gitlink e as adiciona como sub-módulos adequados.
Isso corrigiu para mim, espero que ajude.
fonte
Isso funcionou muito bem para mim:
git update-index --skip-worktree
Se não funcionar com o nome do caminho, tente o nome do arquivo. Deixe-me saber se isso funcionou para você também.
Tchau!
fonte
Teve o mesmo problema, mas não foi resolvido nesta discussão.
Eu bati também o problema do submódulo como descrito na abertura do thread.
Observando o diff, reconheci um -dirty anexado a um hash: a leitura dos documentos novamente resolveu o problema para mim. http://web.mit.edu/jhawk/mnt/spo/git/git-doc/user-manual.html Veja a seção "Armadilhas com submódulos"
O motivo foi que houve alterações ou conteúdo não rastreado no submódulo. Primeiro tive que chegar ao diretório do submódulo, fazer um "git add" + "git commit" para obter todo o conteúdo rastreado no submódulo.
Agora, esse novo HEAD do submódulo pode ser confirmado no módulo mestre.
fonte
Recentemente, encontrei esse problema enquanto trabalhava em um projeto de contrato (considerado classificado). O sistema no qual eu tinha que executar o código não tinha acesso à Internet, por questões de segurança, é claro, e assim a instalação de dependências, usando o compositor e o npm, estava se tornando uma grande dor.
Depois de muita discussão com meu colega, decidimos simplesmente improvisar e copiar e colar nossas dependências, em vez de instalar o compositor ou instalar o npm.
Isso nos levou a NÃO adicionar fornecedores e npm_modules no gitignore. Foi quando eu encontrei esse problema.
Eu pesquisei isso um pouco e encontrei este tópico útil no SO. Como não sou muito profissional no Git e estou um pouco embriagado enquanto trabalhava nele, procurei todos os submódulos na pasta de fornecedores
Isso me deu algumas 4-5 dependências que eram importantes para eles. Eu removi todas essas pastas .git e pronto, funcionou. Eu sei que é hack, e não muito nerd de qualquer maneira. Ó Deus de SO, por favor me perdoe! Da próxima vez, prometo ler gitlinks e obedecer ao poderoso Linus Tovalds.
fonte
Esta pergunta já foi respondida, mas pensei em adicionar à mistura o que descobri quando recebi essas mensagens.
Eu tenho um repositório chamado
playground
que contém vários aplicativos sandbox. Adicionei dois novos aplicativos de um tutorial aoplayground
diretório, clonando o repositório do tutorial. O resultado foi que o material git dos novos aplicativos apontou para o repositório do tutorial e não para o meu repositório. A solução foi excluir o.git
diretório de cada um desses diretóriosmv
dos aplicativos , os diretórios dos aplicativos fora doplayground
diretório e depoismv
executá-los novamentegit add .
. Depois disso, funcionou.fonte
Resolvi esse problema excluindo o arquivo .git da minha subpasta.
fonte
Primeiro, vá para o Diretório : vendor / plugins / open_flash_chart_2 e DELETE
ENTÃO :
RESULTADO
fonte