Git ignorar subpastas

437

Eu tenho muitos projetos na minha solução .Net. Gostaria de excluir todas as pastas "bin / Debug" e "bin / Release" (e seu conteúdo), mas ainda incluir a própria pasta "bin" e qualquer dll contida nela.

.gitignore com "bin /" ignora as pastas "Debug" e "Release", mas também qualquer dll contida na pasta "bin".

"bin / Debug" ou "bin / Release" no arquivo .gitignore não exclui os diretórios, a menos que eu qualifique totalmente o padrão de ignorar como "Solution / Project / bin / Debug" - que não quero fazer como eu será necessário incluir esse padrão completo para cada projeto em minha solução, além de incluí-lo em todos os novos projetos adicionados.

Alguma sugestão?

Marcel
fonte
Por que adicionar as DLLs? Se você estiver referenciando DLLs de terceiros, pode fazer sentido adicionar uma pasta comum à qual todos os seus projetos fazem referência.
Paddy
6
Paddy está certo - se essas são DLLs de terceiros, provavelmente devem ser organizadas longe do seu código. Para mim, no entanto, parece que você está verificando seus próprios produtos de construção, o que geralmente não é o caminho que você deseja seguir. Você usa git para rastrear as informações , que estão totalmente contidas no código e na configuração da compilação. Os produtos são, bem, produtos. Rastreá-los está causando problemas - por exemplo, e se você alterar o código, mas esquecer de criar e verificar novos produtos?
Cascabel
Eu tive um problema ao excluir subpastas. Tentei de tudo, incluindo as amostras exatas escritas aqui, mas sem sucesso. Finalmente, adicionei uma linha em branco adicional entre os padrões das pastas e ele está funcionando. Talvez um problema de codificação. Eu tenho janelas e codifiquei isso em UTF8.
RoadBump 10/10

Respostas:

550

Você já tentou caracteres curinga?

Solution/*/bin/Debug
Solution/*/bin/Release

Com a versão 1.8.2 do git, você também pode usar o **curinga para corresponder a qualquer nível de subdiretórios:

**/bin/Debug/
**/bin/Release/
Josh Lee
fonte
8
Funciona, exceto se houver uma subpasta com outro projeto em, por exemplo, Solução / Módulo / Projeto. Por enquanto, adicionei / * / * / bin / Debug e / * / * / * / bin / Debug (para sub pastas). Parece que você precisa adicionar uma subpasta curinga para cada nível em sua estrutura de diretórios.
Marcel
1
@Marcel: Bem, o git certamente não vai ignorar nenhum arquivo que você não diz - ignora o que corresponde aos caracteres curinga, nem mais, nem menos.
Cascabel
Eu acho que a estrela dupla cruzará os limites do diretório, ou seja: / ** / bin / Debug
Trent
11
@Taras: Infelizmente, isso não acontece.
Tuukka Mustonen
2
Houve um erro no Visual Studio relacionado a **. Agora deve ser corrigido. ligação
Bogac 10/03
106

Você pode usar .gitignore no nível superior para ignorar todos os diretórios no projeto com o mesmo nome. Por exemplo:

Debug/
Release/

Isso deve ser atualizado imediatamente para ficar visível quando você faz o status do git. Assegure-se de que esses diretórios ainda não tenham sido adicionados ao git, pois isso substituirá os ignorados.

Andreas
fonte
O mesmo poderia ser feito adicionando os padrões ao $GIT_DIR/.git/info/excludearquivo OPs .
Tim Henigan
1
A diferença é que o arquivo .gitignore seguirá o código, portanto se aplica a todos os lugares. Enquanto o arquivo de exclusão é local apenas para o seu repositório, o que significa que ele só se aplica a esse repositório específico. A menos que outros committers tenham um motivo para querer confirmar esses diretórios, eu recomendaria o uso de .gitignore.
Andreas
1
Outro problema é se você tiver um projeto em sua solução chamado Debug, que também será ignorado. Acho que a solução é uma combinação de todas as respostas e comentários - reestruture a solução para manter as DLLs comuns ou referenciadas em uma pasta diferente, ignorando "bin /" e / ou use caracteres curinga.
Marcel
16
+1 Para comentar sobre a garantia de diretórios ainda não adicionados ao git. Se já foi adicionado ao git, faça:git rm -rf DirectoryName/
levibostian
57

A questão não está perguntando sobre ignorando todos os subdiretórios, mas eu não conseguia encontrar a qualquer lugar resposta, então eu vou postá-lo: */*.

mgold
fonte
1
Alguma chance de esclarecer? Eu tentei todos os tipos de variações sobre isso e não consigo git addignorar um diretório e todos os arquivos em todos os subdiretórios desse diretório. Eu tentei dirname/, dirname/*, dirname/**, dirname/*/*, mesmo em desespero dirname/*/*/*, dirname/*/*/*/*, dirname/*/*/*/*/*.
Chris
3
*/*ignora todos os subdiretórios, mas não os arquivos no diretório atual. Ignorar um subdiretório específico é um uso normal do gitignore. dirname,, dirname/e dirname/*todo o trabalho para mim. Alguma coisa nesse diretório já foi confirmada?
precisa
É um repositório totalmente novo - eu apago o .gitdiretório inteiro entre as tentativas e git initdepois git add --all .(também tentei sem --all), usando 1.9.4.msysgit.1. Todo subdiretório não vazio no meu diretório nomeado é adicionado ao índice (marcado no TortoiseGit e git status). Não há linhas relevantes no .gitignoreinício, !mas deve haver algum conflito. Resolvido por enquanto removendo as pastas durante add. Acho que isso é algo que exigirá um pouco mais de escavação para fornecer as informações necessárias para o diagnóstico. Obrigado por me garantir que não estou entendendo mal a sintaxe.
Chris
E se eu precisar ignorar uma pasta dentro de uma pasta, mas não a primeira? Como no forum / ignorethisfolder / ... mas ele não deve ignorar a pasta chamada forum
Jean Carlos Racoski
Isso não funciona para mim, ignorando um diretório cujo nome começa com um ponto. " /. " e ". * / *" também não funcionam.
Tony
44

Todas as respostas acima são válidas, mas algo que eu acho que não é mencionado é que, depois de adicionar um arquivo desse diretório ao repositório, você não pode ignorar o diretório / subdiretório que contém esse arquivo (o git ignorará essa diretiva )

Para ignorar os arquivos já adicionados, execute

$ git rm --cached

Caso contrário, você terá que remover todos os arquivos do diretório de destino do repositório primeiro - e então poderá ignorar essa pasta.

ajacian81
fonte
12
git rm --cached se você deseja que eles não sejam rastreados / irrelevantes para o histórico, mas deseja manter os arquivos intactos localmente.
Erik Reppen
29

Além de colocar as entradas corretas no seu arquivo .gitignore, se você estiver tentando ignorar algo já adicionado ao repositório, é necessário fazer git rm -r /path/to/dire confirmar isso antes de adicionar o dir ao seu arquivo .gitignore. Caso contrário, a única coisa que o git irá ignorar é a sua diretiva de ignorar.

MidnightJava
fonte
19

A única maneira de fazer isso funcionar na minha máquina era fazê-lo desta maneira:

# Ignore all directories, and all sub-directories, and it's contents:
*/*

#Now ignore all files in the current directory 
#(This fails to ignore files without a ".", for example 
#'file.txt' works, but 
#'file' doesn't):
/*.*

#Only Include these specific directories and subdirectories:
!wordpress/
!wordpress/*/
!wordpress/*/wp-content/
!wordpress/*/wp-content/themes/

Observe como você deve permitir explicitamente o conteúdo para cada nível que você deseja incluir. Portanto, se eu tiver subdiretórios 5 em temas, ainda preciso esclarecer isso.

Isto é do comentário do @ Yarin aqui: https://stackoverflow.com/a/5250314/1696153

Estes foram tópicos úteis:

Eu também tentei

*
*/*
**/**

e **/wp-content/themes/**

ou /wp-content/themes/**/*

Nada disso funcionou para mim também. Muita trilha e erro!

Katie
fonte
13

Para excluir conteúdo e subdiretórios:

**/bin/*

Para excluir apenas todos os subdiretórios, mas pegar o conteúdo, adicione "/":

**/bin/*/
A. Morel
fonte
9

Para ignorar todos os subdiretórios, você pode simplesmente usar:

**/

Isso funciona a partir da versão 1.8.2 do git.

frederickjh
fonte
8

A maneira genérica de ignorar todas as subpastas, continuando a rastrear os arquivos que estão no /bindiretório, seria adicionar a seguinte linha ao arquivo .gitignore do seu projeto:

bin/*/*

Se você deseja ignorar apenas subpastas nomeadas específicas, você pode:

bin/Debug/*
bin/Release/*

nb. se o bindiretório não estiver na raiz do seu projeto (ao lado do arquivo .gitignore), em vez de por exemplo. bin/*/*você pode precisarpath/to/bin/*/*

Nick F
fonte