SVN: ignorar alguns diretórios recursivamente

106

Eu não quero nenhum diretório chamado build ou distentre no meu SVN, não importa o quão profundo ele esteja na árvore.

Isso é possível? No git acabei de colocar

build
dist

no meu .gitignorena raiz e ele ignora recursivamente. Como faço isso com svn? Por favor, não me diga para fazer um propset em todos os dir ...

Paul Tarjan
fonte
Verifique esta resposta para uma solução nativa se você estiver usando o Subversion 1.8.
Frank Kusters

Respostas:

57

A partir do subversion 1.8, agora existe a svn:global-ignorespropriedade que funciona como, svn:ignoremas recursivamente (então defina isso em seu diretório de nível superior)

gêmeo
fonte
3
Estou um pouco confuso - há global-ignoresno ~/.subversion/configarquivo, mas também a propriedade herdável svn:global-ignores definida em um diretório em um repositório SVN, bem como svn:ignore- você pode fornecer um resumo dessas diferentes opções e como elas se comparam? Como a --recursivebandeira os afeta também?
Dia
2
Fiz minha própria pesquisa e publiquei minhas descobertas nesta resposta de controle de qualidade: stackoverflow.com/a/86052/159145
Dai
[Eu tentei, mas falhei, a objpasta ainda apareceu] ( stackoverflow.com/questions/50960188/… ), você pode me ajudar a dar uma olhada nela?
Lucas
Posso dizer "build / *" ir ignorar tudo abaixo de build em cada pasta de build?
Johannes Schaub - litb
45

svn propsettoma --recursivecomo uma opção, então você pode fazer isso, com duas desvantagens:

  1. você tem que verificar todo o repositório (ou pelo menos todos os diretórios nele), e
  2. você deve se lembrar de definir a svn:ignorepropriedade sempre que adicionar um novo diretório
Michael Hackner
fonte
42

Não é possível fazer isso. Existem apenas dois mecanismos de ignorar no Subversion, svn:ignore(que não é recursivo) e global-ignores(que não é específico para um repositório).

Kevin Reid
fonte
7
svn propset --recursive svn: ignora svn_ignore_rules. onde svn_ignore_rules é um arquivo contendo as regras para ignorar - uma por linha
georg
3
'svn propset --recursive svn: ignore --file svn_ignore_rules.' para mim com svn-1.7.6, senão você está ignorando recursivamente arquivos chamados 'svn_ignore_rules' [editar: conforme 'wytten' em um comentário abaixo]
elbeardmorez
9
Para os comentadores: Como o autor da pergunta disse, “Por favor, não me diga para fazer um propset em cada diretório pai ...”.
Kevin Reid
5
Agora é possível no Subversion 1.8
Squirrel
17

Isso funciona para mim:

 svn propset --recursive svn:ignore *.zip <dir_tree_with_no_zips>
Stewart
fonte
2
Obrigado por isso, funciona muito bem ... A propósito, a única maneira que descobri para ignorar * .txt e * .pdf foi colocar esses padrões em um arquivo e, em seguida, usar a opção 'svn propset --file'
wytten
13

adicione ao seu arquivo ~ / .subversion / config ou / etc / subversion / config:

[miscellany]
global-ignores = build dist
jspcal
fonte
Eu prefiro fazer por repo se eu puder
Paul Tarjan
1
hmm não tenho certeza se existe uma maneira fácil de fazer isso por repo, um gancho de pré-confirmação pode rejeitar certos padrões, mas não é uma solução completa. svn: ignore em cada diretório pai funciona, mas não recursivamente. você pode trocar seu arquivo de configuração por um script ao trabalhar em diferentes repositórios, mas isso é uma etapa extra.
jspcal
1
O que significa build dist ?
IgorGanapolsky de
9

É possível ignorar build e dist dirs removendo os diretórios do controle de versão. O truque é usar a opção --keep-local para deixar o diretório na cópia de trabalho. Por exemplo:

svn rm dist --keep-local
svn ci -m'removed build directory from version control'

O diretório não será mais rastreado pelo subversion, mas ainda estará lá em sua cópia de trabalho para manter a saída do compilador, etc.

saúde, joe

jsharit
fonte
7

Por exemplo, a estrutura da pasta:

Project/
Project/dist/

cd Project
svn propset svn:ignore '*' dist/
svn ci -m "content of dist ignored"

É bom fazer um svn delete do conteúdo dist antes de ignorar o comando, então para ramos dist estará vazio.

Funcionou para mim, testado hoje. Aqui está a página explicando um pouco

marian
fonte
6

Para ignorar todos esses arquivos em todos os repositórios, você pode adicionar um global-ignoresao seu arquivo de configuração por usuário.

Em sistemas semelhantes ao Unix, esta área aparece como um diretório chamado .subversion no diretório inicial do usuário. Em sistemas Win32, o Subversion cria uma pasta chamada Subversion, normalmente dentro da área Application Data do diretório de perfil do usuário

Veja as opções de configuração

Infelizmente, não há opção por repositório para fazer isso. É basicamente por usuário ou por diretório, então o múltiplo svn:ignoresé provavelmente o caminho a percorrer, por mais chato que possa ser.

Blair Conrad
fonte
1
Prefiro fazer por repo, se puder
Paul Tarjan
Oh, então você está sem sorte. Como @Kevin Reid diz - você tem por diretório ou por usuário.
Blair Conrad
6

Primeiro, você precisa ir para a pasta superior de sua cópia de trabalho e criar um arquivo (digamos .svnignore) onde deve colocar todos os padrões que deseja ignorar, por exemplo (para um projeto Android):

bin
gen
proguard
.classpath
.project
local.properties
Thumbs.db
*.apk
*.ap_
*.class
*.dex

Então você executa o seguinte comando (lembre-se de que você deve estar na pasta superior de sua cópia de trabalho):

svn propset svn:ignore -R -F .svnignore .

Isso só funcionará para pastas e arquivos que ainda não estão sob controle de versão. Se você quiser que uma pasta (ou arquivo) que está sendo versionada comece a ser ignorada também, remova-a do controle de versão executando o comando:

svn rm --keep-local <path>

Tudo isso neste excelente artigo que explica tudo: http://superchlorine.com/2013/08/getting-svn-to-ignore-files-and-directories/

Luccas Correa
fonte
Isso foi imensamente útil. Esta é a melhor maneira que encontrei de obter um comportamento de ignorar semelhante ao git no svn. Muito obrigado.
Jonathan Wilson
6

No subversion 1.8, é possível definir global-ignores para o repositório atual.

svn propset svn:global-ignores build .
svn propset svn:global-ignores dist .

Além disso, você pode criar uma pasta chamada .svnignore e escrever as condições.

build
dist

lembre-se de uma condição por linha, definir build / * ou dist / debug é em vão. Então faça o comando:

svn propset svn:global-ignores -F .svnignore .
John Zhu
fonte
funciona perfeitamente! apenas execute o primeiro comando no repo recém-verificado.
gaurav
3

Crie um arquivo e adicione seus itens ignorados a ele

lista de ingores:

file1 
directory1
file2
etc...

então aplique o seguinte comando

for n in directory; do svn propset svn:ignore -F ignore-list $n; done

diretório é o nome do seu diretório, você pode subcategorizar também diretório / subdiretório. Ou use * para indicar o diretório atual em que você está.

Isso pressupõe que você está usando o bash como shell

jncc99
fonte
Qual é o $ n aqui?
IgorGanapolsky de
1
@igor Ganapolsky - $ n é a variável do loop for. Ele será definido como o índice da sequência para a qual você está fazendo um loop; neste caso, o diretório conforme especificado por "diretório" no exemplo acima.
jncc99
3
svn propset --recursive svn:ignore svn_ignore_rules .

onde svn_ignore_rules é um arquivo contendo as regras para ignorar - uma por linha

Claro que você precisa executá-lo novamente toda vez que adicionar um novo diretório ao seu repo

svn_ignore_rules também pode ser considerado como verificado no repo, para ser reutilizável por outros usuários com acesso de gravação ao repo

georg
fonte
2
cd parent_dir # o diretório que contém a pasta a ser ignorada recursivamente
svn propedit svn: ignore. # irá abrir svn-prop.tmp
alistar pasta (s)
^ X
Y
commit -m 'ignorar direcoty direcionado'
Moin Haidar
fonte
me ajudou, tive problemas com a configuração do padrão de pasta, o SVN estava set EDITOR=notepadsvn propedit svn:ignore .
compilando
1

Como parece não haver solução para este problema provavelmente comum, gostaria de compartilhar nossa solução. Como os outros já deixaram claro, você pode usar a svn:ignorepropriedade, que se aplica a um único diretório (e, portanto, não para novos), ou você pode usar global-ignoresque se aplica a um único usuário (mas não pertence ao repositório).

Para tornar a vida um pouco mais fácil, criei um arquivo reg chamado Settings.Svn.rege adicionei-o à raiz do repositório. Agora todos podem clicar duas vezes neste regfile uma vez e ter as configurações feitas.

REGEDIT4

[HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\miscellany]
"global-ignores"="obj *.suo *.bak *.pdb *.user *.Cache*"

Eu realmente apreciaria uma solução dentro do repositório SVN, então, se alguém souber, você gostaria de compartilhá-la?

martinstoeckli
fonte
0

Uma maneira seria adicionar algum tipo de verificação ao gancho pré ou pós-commit, mas é uma observação direta se você não possui o servidor repo.

8DH
fonte