Como rastrear conteúdo não rastreado?


159

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_2e tento git statusnovamente, 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_2plug-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 .gitmodulesno 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 -avez 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.


2
Estou confuso sobre algumas coisas. Um: por que você continua dizendo github? tudo o que você está falando soa local (exceto a seta verde - não sei nada sobre isso). Está certo ou é uma pergunta sobre como enviar atualizações para o github? Segundo: você realmente fez alguma coisa para criar este plugin como um submódulo? Um submódulo é um repositório git por si só. Você o cria separadamente e o adiciona ao superprojeto.
Cascabel

1
Hum, a saída do status git sugere que existe realmente um submódulo lá ... mas você realmente não tem um arquivo .gitmodules? Honestamente, se este plug-in tiver seu próprio repositório e você souber qual versão dele deseja, basta remover o diretório do seu projeto, garantir que não haja entrada no .gitmodules e passar pela configuração do sub-módulo: git submodule add, git submodule update --init.
Cascabel

Jefromi - na verdade, não mencionei o Github mais de duas vezes - a primeira vez é porque a seta verde aparece na parte superior da imagem da pasta amarela no repositório atual do Github para open_flash_chart_2. Felizmente, editarei a resposta para torná-la mais clara.
sscirrus

1
@sscirrus: Você definitivamente deve ter uma preferência, submódulo ou não. Se isso é algo externo em que você não vai trabalhar, mas do qual você pode querer atualizações, deve ser um submódulo. Se você não se preocupa em receber atualizações de seu repositório original e pode querer invadir a fonte sozinho, não deve ser um submódulo.
Cascabel

1
Esta questão parece ser puramente sobre submódulos git. Eu removi algumas tags porque essa pergunta não está diretamente relacionada ao rails ou ao github, seria aplicada a todos os casos de uso do git . E a trackingtag parece ser usada para os tópicos 'rastreamento de visitantes do site', para que também não se aplica.
Edgerunner 12/11/10

Respostas:


239

Você adicionou vendor/plugins/open_flash_chart_2como 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:

git clone git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
git add vendor/plugins/open_flash_chart_2

Este último comando é o problema. O diretório vendor/plugins/open_flash_chart_2começ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 .gitmodulesarquivo (e no .git/configarquivo 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_2como um submódulo é um .gitmodulesarquivo. Normalmente (se você ainda não o incluiu como entrada simples no gitlink), basta usar git submodule add:

git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2

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:

git rm --cached vendor/plugins/open_flash_chart_2
git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2

Isso usará seu sub-repositório existente (ou seja, não re-clonará o repositório de origem) e preparará um .gitmodulesarquivo parecido com este:

[submodule "vendor/plugins/open_flash_chart_2"]
    path = vendor/plugins/open_flash_chart_2
    url = git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2

Também fará uma entrada semelhante no repositório principal .git/config(sem a pathconfiguraçã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_2nã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 .gitdiretó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).

git rm --cached vendor/plugins/open_flash_chart_2
rm -rf vendor/plugins/open_flash_chart_2/.git # BACK THIS UP FIRST unless you are sure you have no local changes in it
git add vendor/plugins/open_flash_chart_2

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 .gitdiretó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.

git rm --cached vendor/plugins/open_flash_chart_2
git commit -m'converting to subtree; please stand by'
mv vendor/plugins/open_flash_chart_2 ../ofc2.local
git subtree add --prefix=vendor/plugins/open_flash_chart_2 ../ofc2.local HEAD
#rm -rf ../ofc2.local # if HEAD was the only tip with local history

Mais tarde:

git remote add ofc2 git://github.com/korin/open_flash_chart_2_plugin.git
git subtree pull --prefix=vendor/plugins/open_flash_chart_2 ofc2 master

git subtree push --prefix=vendor/plugins/open_flash_chart_2 git@github.com:me/my_ofc2_fork.git changes_for_pull_request

A subárvore git também tem uma --squashopçã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.


Chris, eu apenas tentei rm -rf vendor/plugins/open_flash_chart_2/.gite diz 'rm' não é reconhecido. Então eu tentei git rm -rf vendor/plugins/open_flash_chart_2/.gite disse fatal: pathspec 'vendor/plugins/open_flash_chart_2/.git' did not match any files(mas eu posso chegar lá no Windows Explorer!).
Sscirrus

2
Discutimos um pouco sobre o problema no bate-papo . O OP conseguiu remover o .gitdiretório do sub-repositório e adicionar novamente os arquivos “sem rodeios” (a primeira opção “Conteúdo Simples”).
Chris Johnsen

1
Isso salvou minha bunda tanto no outro dia. Eu acidentalmente adicionei algo com um diretório .git ao meu repositório git e, em seguida, o git meio que achou que tinha um submódulo, o que estava causando surtos nos meus dcommits git svn. Eu votaria em você três vezes, se pudesse.
Davidtbernal

Deseja apontar, o plug-in de terceiros subtreenão deve ser confundido com a mesclagem de subárvores. Não é um invólucro. O autor diz que: P
NebulaFox 16/09

@NebulaFox: Embora a subárvore git não seja apenas um invólucro em torno das mesclagens de subárvores, ela certamente usa as mesmas técnicas do procedimento padrão de “mesclagem de subárvores” (ou seja, git readtree --prefix=pathe a subárvore mescla: git mergecom -s subtreeou-Xsubtree=path ). Também possui ótimos extras "on top": --squashmode, the splitcommand pushe pullthee helpers.
Chris Johnsen

114

Eu apenas tive o mesmo problema. O motivo foi porque havia uma subpasta que continha uma pasta ".git". Removê-lo fez o git feliz.


Sim, isso aconteceu comigo no AndroidStudio. O git repo já havia sido criado na pasta / app enquanto eu tentava criar uma pasta do git repo acima. Obrigado.
ZirconCode

Eu tinha um aplicativo angular cli criado em muitas outras pastas e essa pasta tinha uma pasta .git: / Esse é o verdadeiro problema, não as coisas do submódulo!
Pascal

isso funciona para mim ... Eu tentei o git add muitas vezes, mas nada aconteceu. então eu removo a .gitpasta
Ninja

1
Mas e se eu ainda quiser rastrear minha subpasta? O que devo fazer ?
cyber8200

Tenha o mesmo caso. Ainda quero rastrear a subpasta que infelizmente também continha uma pasta .git. Depois de excluir esta pasta .git do sufolder, ela não é mais rastreada na minha pasta
.git


6

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á rastreado

git 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!


5

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).



3

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.

#!/bin/bash

# Read all submodules in current git
MODULES=`git ls-files --stage | grep 160000`

# Iterate through every submodule path
while read -r MOD; do
  # extract submodule path (split line at whitespace and take string with index 3)
  ARRIN=(${MOD})
  MODPATH=${ARRIN[3]}

  # grep module url from .git file in submodule path
  MODURL=`grep "url = " $MODPATH/.git/config`
  MODURL=${MODURL##*=}

  # echo path and url for information
  echo $MODPATH
  echo $MODURL

  # remove existing entry in submodule index
  git rm --cached $MODPATH
  # add new entry in submodule index
  git submodule add $MODURL $MODPATH
done <<< "$MODULES"

Isso corrigiu para mim, espero que ajude.


2

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!


1

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.

% git status          
# On branch master
# Changes not staged for commit:
#   modified:   bundle/taglist (untracked content)

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.

Then "git status" on the master stated
% git commit
# On branch master
# Changes not staged for commit:
#   modified:   bundle/taglist (new commits)

Agora, esse novo HEAD do submódulo pode ser confirmado no módulo mestre.


1

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.

Changed but not updated:
modified:   vendor/plugins/open_flash_chart_2 (modified content, untracked content)

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

find . -name ".git"

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.


1

Esta pergunta já foi respondida, mas pensei em adicionar à mistura o que descobri quando recebi essas mensagens.

Eu tenho um repositório chamado playgroundque contém vários aplicativos sandbox. Adicionei dois novos aplicativos de um tutorial ao playgrounddiretó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 .gitdiretório de cada um desses diretórios mvdos aplicativos , os diretórios dos aplicativos fora do playgrounddiretório e depois mvexecutá-los novamente git add .. Depois disso, funcionou.


1

Resolvi esse problema excluindo o arquivo .git da minha subpasta.

  1. Primeiro exclua o arquivo .git da sua subpasta
  2. Em seguida, remova sua subpasta do git executando este código, git rm -rf --cached your_subfolder_name
  3. Em seguida, adicione sua pasta pelo git add. comando

0

Primeiro, vá para o Diretório : vendor / plugins / open_flash_chart_2 e DELETE


ENTÃO :

git rm --cached vendor/plugins/open_flash_chart_2  
git add .  
git commit -m "Message"  
git push -u origin master  

git status  

RESULTADO

No mestre da filial
Sua filial está atualizada com 'origem / mestre'.
nada a confirmar, diretório de trabalho limpo

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.