É possível verificar os subdiretórios de um repositório no Git?
Imagine que estou configurando uma nova instalação do WordPress. Vou criar dois novos diretórios para a personalização do meu plugin e tema:
wordpress/wp-content/plugins/myplugins/
wordpress/wp-content/themes/mytheme/
Eu quero manter esses diretórios via Git. No Subversion, eu iria fazer isso por ter trunk/myplugins/
e trunk/mytheme/
diretórios e verificar subdiretórios. O Git tem uma maneira de realizar a mesma tarefa usando um único repositório?
Eu poderia estar perdendo o barco em algum paradigma do Git, como um usuário de SVN de longa data com pouca exposição ao Git.
Editar: Várias ramificações armazenando conteúdo diferente é uma maneira interessante de lidar com isso.
git
sparse-checkout
Annika Backstrom
fonte
fonte
Respostas:
As verificações esparsas estão agora no Git 1.7 .
Consulte também a pergunta “ É possível fazer uma verificação esparsa sem verificar primeiro todo o repositório? ”.
Observe que checkouts esparsos ainda exigem o download de todo o repositório, mesmo que alguns dos arquivos baixados pelo Git não acabem na sua árvore de trabalho.
fonte
git clone
comando simples ?? Bem, eu usando esta resposta , está funcionando!/foo/bar/foobar
, é possível vê-lo apenas como/foobar
no meu repositório local?Não existe uma maneira real de fazer isso no git. E se você não fará alterações que afetem as duas árvores ao mesmo tempo como uma única unidade de trabalho, não há um bom motivo para usar um único repositório para ambas. Eu pensei que sentiria falta desse recurso do Subversion, mas descobri que a criação de repositórios tem tão pouca sobrecarga administrativa administrativa (simplesmente devido ao fato de que os repositórios são armazenados ao lado de sua cópia de trabalho, em vez de exigir que eu escolha explicitamente algum lugar fora do cópia de trabalho) que eu me acostumei a criar muitos repositórios de uso único.
Se você insistir (ou realmente precisar dele), poderá criar um repositório git com apenas
mytheme
emyplugins
diretórios e vincular os de dentro da instalação do WordPress.MDCore escreveu:
Observe que isso não é uma preocupação para o git, se você decidir colocar os dois diretórios em um único repositório, porque o git acaba inteiramente com o conceito de aumentar monotonicamente os números de revisão de qualquer forma.
O único critério para quais coisas reunir em um único repositório no git é se constitui uma única unidade, ie. no seu caso, se há alterações nas quais não faz sentido examinar as edições em cada diretório isoladamente. Se você tiver alterações nas quais precisa editar arquivos nos dois diretórios de uma vez e as edições pertencerem juntas, elas deverão ser um repositório. Caso contrário, não os junte.
O Git realmente deseja que você use repositórios separados para entidades separadas.
Os submódulos não atendem ao desejo de manter os dois diretórios em um repositório, porque na verdade imporiam um repositório separado para cada diretório, que é reunido em outro repositório usando submódulos. Pior ainda, como os diretórios dentro da instalação do WordPress não são subdiretórios diretos do mesmo diretório e também fazem parte de uma hierarquia com muitos outros arquivos, usar os repositórios por diretório como submódulos em um repositório unificado não traria nenhum benefício, porque o arquivo unificado repositório não refletiria nenhum caso / necessidade de uso.
fonte
git clone
sequência de comandos simples? Bem, eu usando esta resposta , está funcionando!Uma coisa que eu não gosto nos checkouts esparsos é que, se você quiser fazer check-out de um subdiretório com poucos diretórios, sua estrutura de diretórios deve conter todos os diretórios que o conduzem.
A maneira de solucionar isso é clonar o repositório em um local que não seja minha área de trabalho e criar um link simbólico no diretório da minha área de trabalho para o subdiretório no repositório. O Git funciona dessa maneira muito bem, porque coisas como o status do git exibirão os arquivos de alteração em relação ao seu diretório de trabalho atual.
fonte
Na verdade, os checkouts "restritos" ou "parciais" ou "esparsos" estão em desenvolvimento pesado e atual para o Git. Observe que você ainda terá o repositório completo em
.git
. Portanto, as outras duas postagens são atuais para o estado atual do Git, mas parece que seremos capazes de fazer checkouts esparsos eventualmente. Confira as listas de discussão se você estiver interessado em mais detalhes - eles estão mudando rapidamente.fonte
git clone --filter
do Git 2.19Essa opção realmente pula a busca de objetos desnecessários do servidor:
O servidor deve ser configurado com:
Não há suporte para servidor a partir da v2.19.0, mas ele já pode ser testado localmente.
file://$(path)
é necessário para superar asgit clone
travessuras do protocolo: Como clonar superficialmente um repositório git local com um caminho relativo?Lembre-se que isso
--depth 1
já implica--single-branch
, veja também: Como clonar uma única ramificação no Git?TODO:
--filter=blob:none
ignora todos os blobs, mas ainda busca todos os objetos da árvore. Mas em um repositório normal, isso deve ser pequeno comparado aos arquivos em si, portanto, isso já é bom o suficiente. Perguntado em: https://www.spinics.net/lists/git/msg342006.html Os Devs responderam que um--filter=tree:0
está sendo trabalhado para fazer isso.O formato de
--filter
está documentado emman git-rev-list
.Foi feita uma extensão ao protocolo remoto Git para suportar esse recurso.
Documentos na árvore Git:
Teste
GitHub upstream .
Saída no Git v2.19:
Conclusões: todos os blobs de fora
d1/
estão ausentes.Note-se que
root/root
emybranch/mybranch
também estão desaparecidos, mas--depth 1
esconde que a partir da lista de arquivos ausentes. Se você remover--depth 1
, eles serão exibidos na lista de arquivos ausentes.fonte
Conforme sua edição indica, você pode usar duas ramificações separadas para armazenar os dois diretórios separados. Isso os mantém no mesmo repositório, mas você ainda não pode ter confirmações abrangendo as duas árvores de diretório. Se houver uma alteração em uma que exija uma alteração na outra, você precisará fazer isso como duas confirmações separadas e abrirá a possibilidade de que um par de caixas dos dois diretórios fique fora de sincronia.
Se você deseja tratar o par de diretórios como uma unidade, pode usar 'wordpress / wp-content' como raiz do seu repositório e usar o arquivo .gitignore no nível superior para ignorar tudo, exceto os dois subdiretórios de interesse. Esta é provavelmente a solução mais razoável neste momento.
Supostamente, há poucos anos, os checkouts esparsos estão chegando, mas ainda não há sinal deles no repositório de desenvolvimento do git, nem qualquer indicação de que as mudanças necessárias chegarão lá. Eu não contaria com eles.
fonte
Você não pode fazer check-out de um único diretório de um repositório porque o repositório inteiro é tratado pela única pasta .git na raiz do projeto, em vez da miríade de diretórios .svn do subversion.
O problema com o trabalho em plug-ins em um único repositório é que fazer um commit em, por exemplo, mytheme aumentará o número de revisão do myplugin , portanto, mesmo no subversion, é melhor usar repositórios separados.
O paradigma de subversão para subprojetos é svn: externals, que se traduz um pouco em submódulos no git (mas não exatamente no caso de você ter usado svn: externals antes.)
fonte
Há uma inspiração aqui. Basta utilizar
shell regex
ougit regex
.Use cotação para escapar da interpretação do regex do shell e passar caracteres curinga para o git.
O primeiro não é recursivo, apenas arquivos em uma profundidade
subdir
. Mas o segundo é recursivo.Quanto à sua situação, o seguinte pode ser suficiente.
Basta cortar as linhas conforme necessário.
fonte
Você pode reverter as alterações não confirmadas apenas para um arquivo ou diretório específico:
fonte