Como ignoro arquivos no Subversion?

645

Como ignoro arquivos no Subversion?

Além disso, como localizo arquivos que não estão sob controle de versão?

andyuk
fonte
É divertido ver como cada pergunta simples (provavelmente de um usuário do git) significa muitas respostas complicadas. Se isso acontecer, é o Subversion, querida.
Valerio Bozz

Respostas:

738

(Esta resposta foi atualizada para corresponder ao comportamento dos SVN 1.8 e 1.9)

Você tem 2 perguntas:

Marcando arquivos como ignorados:

Por "arquivo ignorado", quero dizer que o arquivo não aparecerá nas listas mesmo como "não versionado": seu cliente SVN fingirá que o arquivo não existe no sistema de arquivos.

Arquivos ignorados são especificados por um "padrão de arquivo". A sintaxe e o formato dos padrões de arquivo são explicados na documentação online do SVN: http://svnbook.red-bean.com/nightly/en/svn.advanced.props.special.ignore.html "Padrões de arquivo no Subversion".

O Subversion, a partir da versão 1.8 (junho de 2013) e posterior, suporta três maneiras diferentes de especificar padrões de arquivos. Aqui está um resumo com exemplos:

1 - Área de Configuração do Tempo de Execução - global-ignoresopção:

  • Essa é uma configuração somente do lado do cliente , portanto, o seuglobal-ignores lista não seja compartilhada por outros usuários, e se aplica a todos os repositórios que você faz checkout no seu computador.
  • Essa configuração é definida no arquivo da área de configuração do tempo de execução:
    • Windows (baseado em arquivo) - C:\Users\{you}\AppData\Roaming\Subversion\config
    • Windows (baseado em registro) - Software\Tigris.org\Subversion\Config\Miscellany\global-ignoresem ambos HKLMe HKCU.
    • Linux / Unix - ~/.subversion/config

2 - A svn:ignorepropriedade, que está definida nos diretórios (não nos arquivos):

  • Isso é armazenado no repositório, para que outros usuários tenham os mesmos arquivos de ignorados. Semelhante a como .gitignorefunciona.
  • svn:ignoreé aplicado aos diretórios e não é recursivo ou herdado. Qualquer arquivo ou imediato subdiretório diretório pai que corresponda ao padrão de arquivo será excluído.
  • Enquanto o SVN 1.8 adiciona o conceito de "propriedades herdadas", a svn:ignoreprópria propriedade é ignorada nos diretórios descendentes não imediatos:

    cd ~/myRepoRoot                             # Open an existing repo.
    echo "foo" > "ignoreThis.txt"                # Create a file called "ignoreThis.txt".
    
    svn status                                  # Check to see if the file is ignored or not.
    > ?    ./ignoreThis.txt
    > 1 unversioned file                        # ...it is NOT currently ignored.
    
    svn propset svn:ignore "ignoreThis.txt" .   # Apply the svn:ignore property to the "myRepoRoot" directory.
    svn status
    > 0 unversioned files                       # ...but now the file is ignored!
    
    cd subdirectory                             # now open a subdirectory.
    echo "foo" > "ignoreThis.txt"                # create another file named "ignoreThis.txt".
    
    svn status
    > ?    ./subdirectory/ignoreThis.txt        # ...and is is NOT ignored!
    > 1 unversioned file
    

    (Portanto, o arquivo ./subdirectory/ignoreThisnão é ignorado, mesmo que " ignoreThis.txt" seja aplicado na .raiz do repositório).

  • Portanto, para aplicar uma lista de ignorados recursivamente, você deve usar svn propset svn:ignore <filePattern> . --recursive.

    • Isso criará uma cópia da propriedade em todos os subdiretórios.
    • Se o <filePattern>valor for diferente em um diretório filho, o valor da criança substituirá completamente os pais, portanto, não haverá efeito "aditivo".
    • Portanto, se você alterar o <filePattern>na raiz ., deverá alterá-lo com --recursivepara substituí-lo nos diretórios filho e descendente.
  • Observo que a sintaxe da linha de comando é contra-intuitiva.

    • Comecei assumindo que você ignoraria um arquivo no SVN digitando algo como, svn ignore pathToFileToIgnore.txtno entanto, não é assim que o recurso de ignorar do SVN funciona.

3- A svn:global-ignorespropriedade. Requer SVN 1.8 (junho de 2013):

  • É semelhante a svn:ignore, exceto que faz uso do recurso "propriedades herdadas" do SVN 1.8.
  • Compare com svn:ignore, o padrão de arquivo é aplicado automaticamente em todos os diretórios descendentes (não apenas nos filhos imediatos).
    • Isso significa que é desnecessário definir svn:global-ignorescom o --recursivesinalizador, pois os padrões de arquivos ignorados herdados são aplicados automaticamente à medida que são herdados.
  • Executando o mesmo conjunto de comandos que no exemplo anterior, mas usando svn:global-ignores:

    cd ~/myRepoRoot                                    # Open an existing repo
    echo "foo" > "ignoreThis.txt"                       # Create a file called "ignoreThis.txt"
    svn status                                         # Check to see if the file is ignored or not
    > ?    ./ignoreThis.txt
    > 1 unversioned file                               # ...it is NOT currently ignored
    
    svn propset svn:global-ignores "ignoreThis.txt" .
    svn status
    > 0 unversioned files                              # ...but now the file is ignored!
    
    cd subdirectory                                    # now open a subdirectory
    echo "foo" > "ignoreThis.txt"                       # create another file named "ignoreThis.txt"
    svn status
    > 0 unversioned files                              # the file is ignored here too!
    

Para usuários do TortoiseSVN:

Todo esse arranjo foi confuso para mim, porque a terminologia do TortoiseSVN (usada no sistema de menus do Windows Explorer) era inicialmente enganosa para mim - eu não tinha certeza do significado do menu "Adicionar recursivamente", "Adicionar *" e "Adicionar" do menu Ignorar opções Espero que este post explique como o recurso Ignorar se vincula ao recurso SVN Properties. Dito isso, sugiro o uso da linha de comando para definir arquivos ignorados, para que você tenha uma idéia de como ele funciona, em vez de usar a GUI, e use apenas a GUI para manipular propriedades depois de se sentir confortável com a linha de comando.

Listando arquivos que são ignorados:

O comando svn statusocultará arquivos ignorados (ou seja, arquivos que correspondam a um global-ignorespadrão RGA , ou que correspondam ao padrão de um diretório pai imediato svn:ignoreou que correspondam a qualquer svn:global-ignorespadrão do diretório do ancesor .

Use a --no-ignoreopção para ver os arquivos listados. Os arquivos ignorados têm um status de I, em seguida, canalize a saída para grepmostrar apenas as linhas começando com "I".

O comando é:

svn status --no-ignore | grep "^I"

Por exemplo:

svn status
> ? foo                             # An unversioned file
> M modifiedFile.txt                # A versioned file that has been modified

svn status --no-ignore
> ? foo                             # An unversioned file
> I ignoreThis.txt                  # A file matching an svn:ignore pattern
> M modifiedFile.txt                # A versioned file that has been modified

svn status --no-ignore | grep "^I"
> I ignoreThis.txt                  # A file matching an svn:ignore pattern

ta-da!

andyuk
fonte
6
Para localizar arquivos ignorados: svn status -u -v --no-ignore | grep "^ I" | awk "{print \ $ 2}"
Christian Madsen
3
Se você deseja ignorar o arquivo ./FolderA/FolderB/FileToIgnore, faça isso a partir do seu. pasta: svn propset svn: ignore "FileToIgnore" FolderA / FolderB /
jnj
8
se você estiver ssh'ing svn propedit svn:ignore .e nenhum editor de texto estiver configurado, você receberá uma mensagem de erro dizendo svn: E205007: Nenhuma das variáveis ​​de ambiente SVN_EDITOR, VISUAL ou EDITOR está definida e nenhuma opção de configuração de tempo de execução 'editor-cmd' foi encontrado em vez de abrir um editor. Então, apenas especifique --editor-cmd nano como este #svn propedit svn:ignore . --editor-cmd nano
Jonathan Morales Vélez
12
Você também pode ignorar arquivos com um nome de arquivo específico em todas as subpastas usando o argumento "--recursive". ie svn propset svn: ignore "* .jpg". --recursivo
Templário
2
Uma alternativa mais simples para awk é grep:svn status | grep '^?'
Johnride
91

Use o comando a seguir para criar uma lista que não esteja nos arquivos de controle de versão.

svn status | grep "^\?" | awk "{print \$2}" > ignoring.txt

Em seguida, edite o arquivo para deixar apenas os arquivos que você deseja realmente ignorar . Em seguida, use este para ignorar os arquivos listados no arquivo:

svn propset svn:ignore -F ignoring.txt .

Observe o ponto no final da linha. Diz ao SVN que a propriedade está sendo definida no diretório atual.

Exclua o arquivo:

rm ignoring.txt

Finalmente comprometa,

svn ci --message "ignoring some files"

Você pode então verificar quais arquivos são ignorados via:

svn proplist -v
ulitosCoder
fonte
2
Agradável. Uma pequena melhoria é svn status | awk "/^?/ {print \$2}" > ignoring.txt.
Dirk Eddelbuettel
4
por que excluir o arquivo? mantê-lo em repo se u precisa re criar / adicionar / remover
tgkprog
Observe que esta solução não ignorará os arquivos nos subdiretórios (mesmo que eles apareçam no arquivo ignoring.txt).
Shaneb 24/04
Isso manteria os ignora existentes? Caso contrário, como fazê-lo em um comando (ou seja, --no-ignora e também manter linhas precedidas por I)?
a1an
Isso sobrescreveria as ignições atuais, tente: svn pg svn:ignore . >> ignore.txtapós o primeiro comando para acrescentar as ignições atuais ao arquivo.
ulitosCoder
55

.gitignore como abordagem

Você pode ignorar um arquivo ou diretório como .gitignore. Basta criar um arquivo de texto da lista de diretórios / arquivos que você deseja ignorar e executar o código abaixo:

svn propset svn:ignore -F ignorelist.txt .

OU, se você não quiser usar um arquivo de texto, faça o seguinte:

svn propset svn:ignore "first
 second
 third" .

Fonte: Blog de Karsten - Defina svn: ignore para vários arquivos da linha de comando

Adrian Enriquez
fonte
1
Note que se você posteriormente modificar seu arquivo de ignorar, você precisa executar novamente o svn:ignorecomando (ver stackoverflow.com/a/58380306/189518 )
Sensei James
50

Se você estiver usando o TortoiseSVN , clique com o botão direito do mouse em um arquivo e selecione TortoiseSVN / Adicionar à lista de ignorados . Isso adicionará o arquivo / curinga aosvn:ignore propriedade

svn:ignoreserá verificado quando você estiver registrando arquivos e os arquivos correspondentes serão ignorados. Eu tenho a seguinte lista de ignorados para um projeto do Visual Studio .NET:

bin obj
*.exe
*.dll
_ReSharper
*.pdb
*.suo

Você pode encontrar esta lista no menu de contexto em TortoiseSVN / Properties .

artur02
fonte
26

Como ninguém parece ter mencionado isso ...

svn propedit svn:ignore .

Em seguida, edite o conteúdo do arquivo para especificar os padrões a serem ignorados, saia do editor e pronto.

Yorick
fonte
3
Esta resposta foi útil. No meu caso, eu precisava mudar "." para o subdiretório do arquivo que eu queria ignorar e apenas especifique o padrão do arquivo. Além disso, pela primeira vez, eu precisava executar este (eu estou no Mac): export SVN_EDITOR = "nano"
Elijah Lofgren
22

Encontrei o artigo .svnignore Example for Java .

Exemplo: .svnignore para Ruby on Rails,

/log

/public/*.JPEG
/public/*.jpeg
/public/*.png
/public/*.gif

*.*~

E depois disso:

svn propset svn:ignore -F .svnignore .

Exemplos para .gitignore. Você pode usar para o seu .svnignore

https://github.com/github/gitignore

d.danailov
fonte
1
Eu fiz como você disse ... mas quando executo o status svn. ainda mostra os arquivos ignorados com "?"
Harshit Gupta 27/03
Eu nunca verifiquei com o status svn, mas com o svn add * e depois disso o svn commit, ignorar arquivos, não é commit.
d.danailov
se um arquivo "a.txt" já estiver no controle de versão, a ignição será feita pelo comando "svn propset svn: ignore -F .svnignore a.txt"? está correto ?
errakeshpd
Se você adicionar "a.txt" no seu arquivo .svnignore, não tenho certeza, mas o comando deve ser corretamente.
d.danailov
10

Ao usar o propedit, verifique se não há espaços à direita, pois isso fará com que o arquivo seja excluído da lista de ignorados.

Eles serão inseridos automaticamente se você usar o preenchimento automático de tabulação no linux para criar o arquivo, para começar:

svn propset svn:ignore 'file1
file2' .
Kenneth
fonte
6
Isso funciona apenas para algumas conchas, como o bash. Observe que a reemissão do comando propset substitui o conjunto anterior de padrões.
JA Faucett
Então file1 e file2 tem que estar em linhas separadas?
IgorGanapolsky
8

Outra solução é:

svn st | awk '/^?/{print $2}' > svnignore.txt && svn propget svn:ignore >> svnignore.txt && svn propset svn:ignore -F svnignore.txt . && rm svnignore.txt

ou linha por linha

svn st | awk '/^?/{print $2}' > svnignore.txt 
svn propget svn:ignore >> svnignore.txt 
svn propset svn:ignore -F svnignore.txt . 
rm svnignore.txt

O que faz:

  1. Obtém os arquivos de status do svn
  2. Salva todos os arquivos com ? para o arquivo "svnignore.txt"
  3. Obtém os arquivos já ignorados e os anexa ao arquivo "svnignore.txt"
  4. Diz ao svn para ignorar os arquivos em "svnignore.txt"
  5. Remove o arquivo
bkbilly
fonte
8

Além disso, se você usar o Tortoise SVN, poderá fazer o seguinte:

  1. No menu de contexto, selecione "TortoiseSVN" e, em seguida, "Propriedades"
  2. Na janela exibida, clique em "Novo", depois em "Avançado"
  3. Na janela exibida ao lado de "Nome da propriedade", selecione ou digite "svn: ignore", ao lado de "Valor da propriedade", digite o nome do arquivo desejado ou o nome da pasta ou a máscara do arquivo (no meu caso, era "* / target"), clique em "Aplicar propriedade recursivamente "
  4. Está bem. Está bem.
  5. Confirmar
msangel
fonte
6
  1. cd ~ / .subversion
  2. configuração aberta
  3. encontre a linha como 'global-ignores'
  4. defina ignorar o tipo de arquivo como este: global-ignores = * .o * .lo * .la * .al .libs * .so .so. [0-9] * .pyc * .pyo 88 * .rej ~ # #. # *. *. swp .DS_Store node_modules output
范 陆 离
fonte
Obrigado, sua resposta é a única que menciona o configarquivo.
Henrique de Sousa
Esta resposta também menciona @HenriquedeSousa stackoverflow.com/a/86052/7724 e também explica que é uma maneira local apenas de cliente de ignorar arquivos.
bzlm
5

Uma versão mais legível da resposta de bkbilly:

svn st | awk '/^?/{print $2}' > svnignore.txt
svn propget svn:ignore >> svnignore.txt
svn propset svn:ignore -F svnignore.txt .
rm svnignore.txt

O que faz:

  1. Obtém os arquivos de status do svn
  2. Salva todos os arquivos com ? para o arquivo "svnignore.txt"
  3. Obtém os arquivos já ignorados e os anexa ao arquivo "svnignore.txt"
  4. Diz ao svn para ignorar os arquivos em "svnignore.txt"
  5. Remove o arquivo
LivingDust
fonte
Gosto da resposta do bkbilly, mas esta versão quebra cada linha para torná-la mais legível e remove o && que em meus testes não fez nada, já que a primeira linha sempre cria o arquivo temporário, e esse mesmo arquivo temporário sempre entra na lista de ignorados.
LivingDust 01/12/16
Uma proposição de edição seria mais apropriada nesse caso. Aprecie o esforço!
Jim
Ainda não tinha reputação suficiente para sugerir uma edição. mas não quero estragar um bom protocolo. Existe um README simples sobre diretrizes para quando é melhor sugerir e editar, em vez de postar uma nova resposta etc?
LivingDust 12/12
1
Se a sua resposta for exatamente a mesma que a postada há um ano e meio, é bem simples. Você até copiou a explicação " O que faz ".
Jim
3

Você também pode definir um padrão de ignição global no arquivo de configuração do SVN.

petr k.
fonte
1
Você pode definir um padrão de ignorância para um repositório específico?
David Doria
2

Use o comando svn status em sua cópia de trabalho para mostrar o status dos arquivos, os arquivos que ainda não estão sob controle de versão (e não são ignorados) terão um ponto de interrogação ao lado deles.

Quanto a ignorar arquivos, você precisa editar a propriedade svn: ignore, leia o capítulo Ignorando Itens Nãoversionados no svnbook em http://svnbook.red-bean.com/en/1.5/svn.advanced.props.special.ignore. html . O livro também descreve mais sobre o uso do status svn.

Andreas Holstenson
fonte
2

SVN ignore é fácil de gerenciar no TortoiseSVN. Abra o TortoiseSVN e clique com o botão direito do mouse no menu arquivo e selecione Adicionar à lista de ignorados.

Isso adicionará os arquivos na svn:ignorepropriedade Ao fazer o check-in dos arquivos, os arquivos correspondentes asvn:ignore serão ignorados e não serão confirmados.

No projeto Visual Studio, adicionamos os seguintes arquivos para ignorar:

bin obj
*.exe
*.dll
*.pdb
*.suo

Estamos gerenciando o código-fonte no SVN do Comparetrap usando esse método com êxito

Slack
fonte
2

O que funcionou para mim:

Como ignoro arquivos no Subversion?
1.No File Explorer, clique com o botão direito do mouse no nome da pasta do projeto SVN
2.Clique em "SVN Commit ..."
3.A janela "commit" será exibida
4.Clique com o botão direito do mouse na pasta / arquivo que você deseja ignorar
5.Clique em Adicionar à lista de ignorados
6.Selecione a pasta / arquivo
7.Commit a "alteração de propriedade" para SVN

Além disso, como localizo arquivos que não estão sob controle de versão?
Após a Etapa 3 acima, clique em "Mostrar arquivos não versionados"

jumping_monkey
fonte
0
  1. aberto, você usa o JetBrains Product (ou seja, Pycharm)
  2. clique no botão 'confirmar' na barra de ferramentas superior ou use o atalho 'ctrl + k' screenshot_toolbar
  3. na interface de confirmação, mova seus arquivos indesejados para outra lista de alterações, como a seguir. screenshot_commit_change
  4. da próxima vez, você só pode confirmar a lista de alterações padrão.
G. Googol
fonte