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:
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_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 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 .gitmodules
arquivo 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 path
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).
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 .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.
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 --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.