Como ignoro um diretório com o SVN?

760

Comecei a usar o SVN e tenho um diretório de cache que não preciso sob controle de origem. Como posso ignorar todo o diretório / pasta com o SVN?

Estou usando versões e TextMate no OS X e linha de comando.

Gilean
fonte
3
Pergunta semelhante respondida aqui [SVN Checkout ignorar pasta] [1] [1]: stackoverflow.com/questions/192824/svn-checkout-ignore-folder
mloskot
Possível duplicata de Como ignoro arquivos no Subversion? (Eu não me importo muito o caminho que o duplicado vai, nem conjunto de respostas é, obviamente, melhor do que o outro.)
Jeffrey Bosboom

Respostas:

796

Defina a svn:ignorepropriedade do diretório pai:

svn propset svn:ignore dirname .

Se você tiver várias coisas para ignorar, separe por novas linhas no valor da propriedade. Nesse caso, é mais fácil editar o valor da propriedade usando um editor externo:

svn propedit svn:ignore .
Jason Cohen
fonte
2
@ Kouber: Seu problema é que a expansão do shell não conhece as propriedades svn: ignore. Portanto, usar '*' como parâmetro explicityl passa tmp para o comando commit. Tente algo como 'svn commit -m "Mais acentos".'
MarkusSchaber
4
Obrigado pela resposta. Pico como editor: svn propedit svn: ignore. --editor-cmd pico
hade
157
Nota: Isso não funcionará se o diretório já estiver "no" svn. svn rm --keep-local dirnameprimeiro. (Minha saída svn status era enorme e eu bati minha cabeça no presente por um tempo.)
Erik Aronesty
10
Se você quiser ignorar mais de um arquivo / pasta, adicione todos os seus nomes para um arquivo txt, uma linha de cada um, e use a seguinte variante:svn propset svn:ignore -F file.txt .
petervaz
2
Tenha cuidado para definir svn:ignoree não svn::ignorecomo eu. Você pode definir propriedades arbitrárias, para que a última seja OK, e você pode ver e editar a propriedade, mas isso não fará com que o SVN ignore os arquivos listados.
Richard Turner
406

Aqui está um exemplo de estrutura de diretório:

\project
    \source
    \cache
    \other

Quando projectvocê vê que seu diretório de cache não é adicionado e aparece como tal.

> svn st
M  source
?  cache

Para definir a propriedade ignorar, faça

svn propset svn: ignora o cache.

onde svn:ignoreé o nome da propriedade que você está configurando, cacheo valor da propriedade e .o diretório em que você está configurando esta propriedade. Deve ser o diretório pai do cachediretório que precisa da propriedade.

Para verificar quais propriedades estão definidas:

> svn proplist
Properties on '.':
  svn:ignore

Para ver o valor de svn:ignore:

> svn propget svn:ignore
cache

Para excluir propriedades definidas anteriormente:

svn propdel svn:ignore
craigb
fonte
17
Um ponto complicado aqui que me deparei. Certifique-se de não adicionar uma barra final dirname. Por exemplo, ao digitar svn propset svn:ignore dirname, se você permitir que o shell (bash) preencha o nome do diretório para você, ele adicionará a barra final, deixando o comando svn propset svn:ignore dirname/, o que não faz com que a pasta seja ignorada. Pelo menos, essa foi a minha experiência.
David Weinraub
4
O diretório 'cache' ainda será listado em 'svn st'. Existe uma maneira de removê-lo da exibição? (sem excluir a partir do disco)
Tom Brito
131

Importante mencionar:

Na linha de comando, você não pode usar

svn add *

Isso também adicionará os arquivos ignorados, porque a linha de comando se expande *e, portanto, svn addacredita que você deseja que todos os arquivos sejam adicionados. Portanto, use isso:

svn add --force .
binco
fonte
faça exatamente como @binco disse: svn add --force *NÃO FUNCIONA . Use o ponto, não a estrela.
Manuell
80

Como passei um tempo tentando fazer isso funcionar, observe que, se os arquivos já existirem no SVN, você precisará svn deletedeles e, em seguida, edite a svn:ignorepropriedade.

Sei que parece óbvio, mas eles continuavam aparecendo como ?na minha svn statuslista, quando pensei que os ignoraria localmente.

Kai
fonte
8
Não se esqueça de usar a opção --keep-local ao excluir os arquivos, se você quiser apenas ignorá-los e não realmente excluí-los.
Dylan Holmes
71

Para expandir um pouco, se você estiver fazendo isso com a ferramenta de linha de comando svn, digite:

svn propedit svn:ignore path/to/dir

que abrirá o editor de texto de sua escolha e digite '*' para ignorar tudo o que estiver dentro dele e salvar + sair - isso incluirá o próprio diretório no svn, mas ignore todos os arquivos dentro dele, para ignorar o diretório, use o caminho do pai e digite o nome do diretório no arquivo Após salvar, execute uma atualização ('svn up') e verifique o caminho apropriado.

Greg
fonte
8
Muito bom ponto, obrigado. Todas as outras respostas perderam o caso de diretórios aninhados. Portanto, no exemplo acima (trabalhando), você digita o editor ignored_directory (que é por suposição um nível abaixo do caminho / to / dir). Porém, isso não funcionará: svn propedit svn: ignore. e, em seguida, digitando o caminho / to / dir / ignored_directory no editor. IOW: SVN corresponde aos objetos um nível abaixo de cada vez.
greenoldman
30

Defina a svn:ignorepropriedade no diretório pai:

$ cd parentdir
$ svn ps svn:ignore . 'cachedir'

Isso substituirá qualquer valor atual de svn:ignore. Você pode editar o valor com:

$ svn pe svn:ignore .

O que abrirá seu editor. Você pode adicionar vários padrões, um por linha.

Você pode visualizar o valor atual com:

$ svn pg svn:ignore .

Se você estiver usando uma GUI, deve haver uma opção de menu para fazer isso.

Frank Szczerba
fonte
3
svn ps svn:ignore . 'cachedir'resulta em cachedir is not under version control. mudando para svn ps svn:ignore 'cachedir' .funcionou para mim
DiCaprio
21

Obrigado por todas as contribuições acima. Gostaria apenas de compartilhar algumas informações adicionais de minhas experiências, ignorando arquivos.


Quando as pastas já estão sob controle de revisão

Após svn import e svn co os arquivos, o que geralmente fazemos pela primeira vez.

Todo o cache de tempo de execução, as pastas de anexos estarão sob controle de versão. então, antes de svn ps svn: ignore , precisamos excluí-lo do repositório.

Com o SVN versão 1.5 acima, podemos usar svn del --keep-local your_folder, mas para uma versão anterior, minha solução é:

  1. svn exporta uma cópia limpa de suas pastas (sem .svnpasta oculta)
  2. svn del local e repositório,
  3. svn ci
  4. Copie de volta as pastas
  5. Faça svn st e confirme se as pastas estão sinalizadas como '?'
  6. Agora podemos fazer svn ps de acordo com as soluções

Quando precisamos que mais de uma pasta seja ignorada

  • Em um diretório, tenho duas pastas que precisam ser definidas como svn:ignore
  • Se definirmos um, o outro será removido.
  • Então nos perguntamos que precisamos de svn pe

svn peprecisará editar o arquivo de texto e você pode usar este comando, se necessário, para configurar seu editor de texto usando o vi :

export SVN_EDITOR=vi
  1. Com "o" você pode abrir uma nova linha
  2. Digite todos os nomes de pastas que você deseja ignorar
  3. Pressione a tecla 'esc' para sair do modo de edição
  4. Digite ": wq" e pressione Enterpara salvar e sair

O arquivo se parece com algo assim:

runtime
cache
attachments
assets
Elliot Yap
fonte
você também pode usar svn propset svn:ignore -F .ignorethesefiles ., o que usará o conteúdo do arquivo. Eu gosto de mantê-lo por perto para que você saiba o que é ignorado. As edições requerem um conjunto de acompanhamento.
precisa
20

Remova primeiro ...

Se seu diretório foojá estiver sob controle de versão, remova-o primeiro com:

svn rm --keep-local foo

... então ignore:

svn propset svn:ignore foo .
queimaduras mate
fonte
12

... e se você deseja ignorar mais de um diretório (digamos build/ temp/e *.tmparquivos), pode fazê-lo em duas etapas (ignorando a primeira e editando as propriedades de ignorar (veja outras respostas aqui) ou pode-se escrever algo como

svn propset svn:ignore "build
temp
*.tmp" .

na linha de comando.

DerMike
fonte
12

Se você estiver usando o cliente SVN específico TortoiseSVN , ao confirmar, você tem a opção de clicar com o botão direito do mouse nos itens e selecionar "Adicionar à lista de ignorados".

Michael Lang
fonte
9

O comando para ignorar várias entradas é um pouco complicado e requer barras invertidas.

svn propset svn:ignore "cache\
tmp\
null\
and_so_on" .

Este comando irá ignorar qualquer coisa nomeada cache, tmp, null, e and_so_onno diretório atual.

James Stroud
fonte
6
E apenas para esclarecer: A barra invertida aqui não é um recurso do svn; é simplesmente uma maneira de inserir uma string de várias linhas no shell. Você também pode usar um editor e apenas escrever várias linhas.
sleske
A barra invertida não é necessária para o bash. o bash é inteligente o suficiente para saber que a "está aberto e não para processar a linha. Tudo o que você precisa fazer é pressionar enter após cache, tmp e null. Você verá que o bash altera o prompt para> para que você saiba que você ainda está digitando o comando.Uma alternativa é começar a digitar o comando (svn) e, em seguida, pressione esc e v. Isso permitirá que você insira o comando no editor.Pressione ZZ ao concluir a execução do comando.Se você mudar de idéia e não deseja executar, então: q !.
Michael Potter
1
svn propset svn:ignore -F .ignorethesefiles .permitirá que você use um arquivo. E como mencionado, você sempre tem propedit.
precisa
5

Eu tive problemas para ignorar diretórios aninhados; o diretório principal que eu queria ignorar não seria exibido com 'svn status', mas todos os subdiretórios. Provavelmente isso é evidente para todos os outros, mas pensei em compartilhar:

EXEMPLO:

/tronco

/ trunk / cache

/ trunk / cache / subdir1

/ trunk / cache / subdir2

cd /trunk
svn ps svn:ignore . /cache
cd /trunk/cache
svn ps svn:ignore . *
svn ci
brainycat
fonte
4

"Obrigado" svn por uma maneira tão hedionda, falsa e difícil de ignorar arquivos.

Então, eu escrevi um script svn-ignore-all :

#!/bin/sh

# svn-ignore-all

# usage: 
#   1. run svn status to see what is going on at each step 
#   2. add or commit all files that you DO want to have in svn
#   3. remove any random files that you don't want to svn:ignore
#   4. run this script to svn:ignore everything marked '?' in output of `svn status`

svn status |
grep '^?' |
sed 's/^? *//' |
while read f; do
    d=`dirname "$f"`
    b=`basename "$f"`
    ignore=`svn propget svn:ignore "$d"`
    if [ -n "$ignore" ]; then
        ignore="$ignore
"
    fi
    ignore="$ignore$b"
    svn propset svn:ignore "$ignore" "$d"
done

Além disso, para ignorar uma lista específica de arquivos / nomes de caminho, podemos usar esta variante svn-ignore . Eu acho que o svn-ignore-all deve realmente ser como o xargs svn-ignore.

#!/bin/sh

# svn-ignore

# usage:
#   svn-ignore file/to/ignore ...

for f; do
    d=`dirname "$f"`
    b=`basename "$f"`
    ignore=`svn propget svn:ignore "$d"`
    if [ -n "$ignore" ]; then
        ignore="$ignore
"
    fi
    ignore="$ignore$b"
    svn propset svn:ignore "$ignore" "$d"
done

Mais uma coisa: costumo poluir meus check-ins svn com muitos arquivos aleatórios. Quando é hora de confirmar, movo esses arquivos para um subdiretório 'antigo' e digo ao svn para ignorar 'antigo'.

Sam Watkins
fonte
Ei Sam, esse é um ótimo roteiro. Pergunta surgiu na minha cabeça: será que talvez o problema ocorra pelo fato de ignorar uma pasta inteira que faz parte do repositório não funcionar, então acabamos com esses '?' arquivos que são basicamente arquivos modificados em pastas que adicionamos à lista de ignorados? Eu me pergunto se existe uma maneira de contornar o seu script, pois seria tedioso executá-lo o tempo todo. Você?
SquareCat 15/09/14
não, eu realmente não uso! apenas tentar limpar meus arquivos
Sam Watkins
4

Bash oneliner para várias ignorações:

svn propset svn:ignore ".project"$'\n'".settings"$'\n'".buildpath" "yourpath"
Fedir RYKHTIK
fonte
3

Se o diretório do seu projeto for nomeado / Project, e o diretório do cache for nomeado / Project / Cache, será necessário definir uma propriedade do subversion em / Project. O nome da propriedade deve ser "svn: ignore" e o valor da propriedade deve ser "Cache".

Consulte esta página no manual do Subversion para obter mais informações sobre propriedades.

The Digital Gabeg
fonte
3

A resposta de Jason fará o truque. No entanto, em vez de definir svn: ignore para "." no diretório de cache, você pode incluir "cache" na propriedade svn: ignore do diretório pai , caso o diretório de cache nem sempre esteja presente. Eu faço isso em várias pastas "descartáveis".

harpo
fonte
3

PARA MANTER DIRETÓRIOS QUE A SVN IGNORARÁ:

  1. isso excluirá os arquivos do repositório, mas manterá o diretório sob controle SVN:

svn delete --keep-local path / directory_to_keep / *

  1. defina para ignorar o diretório (e todo o conteúdo):

svn propset svn: ignora "*" path / directory_to_keep

sheasie
fonte
2

Se você estiver usando um front-end para SVN como o TortoiseSVN ou algum tipo de integração IDE, também deverá haver uma opção de ignorar no mesmo menu da operação de confirmação / adição.

Chris Marasti-Georg
fonte
1

Defina a propriedade svn: ignore . A maioria das ferramentas svn da interface do usuário tem uma maneira de fazer isso, bem como a discussão da linha de comando no link.

Joe Skora
fonte
1

Como você está usando as versões, é realmente muito fácil:

  • Navegue na sua cópia com check-out
  • Clique no diretório para ignorar
  • Na caixa "Ignorar, à direita, clique em Editar
  • Digite *. * Para ignorar todos os arquivos (ou * .jpg para apenas arquivos jpg, etc.)
Andrew
fonte
1

Assista suas barras à direita também. Descobri que a inclusão images/*no meu arquivo de configuração de ignorar não ignorou ./images/. Quando corri svn status -u, ainda mostrava ? images. Então, mudei a configuração de ignorar para apenas images, sem barras. Executou uma verificação de status e a limpou.

cdmo
fonte
1

Resolvido com o Eclipse da seguinte maneira:

Primeiro, faça uma sincronização da sua pasta no projeto:

equipe -> sincronizar

Na próxima exibição, exibição de equipe, é possível ver todos os recursos que você pode confirmar no servidor SVN.

Portanto, selecione a pasta do recurso que você deseja ignorar e, em seguida, você pode ignorá-lo usando

equipe -> adicionar a svn:ignore.

Depois disso, na janela de confirmação, selecione a primeira opção: "ignorar por nome".

Por exemplo, se eu quiser ignorar a pasta de destino e seus recursos .class, sincronizarei e, na exibição de sincronização, selecionarei a pasta de destino. Depois disso, selecionarei

team-> add

para svn:ignoree depois confirmarei a primeira opção na janela de confirmação.

Antonio Martin
fonte
0

Depois de perder muito tempo procurando como realizar essa atividade simples, decidi postar que não era difícil encontrar uma explicação decente.

Primeiro deixe a estrutura da amostra

$ svn st? projeto / tronco / alvo? projeto / tronco / myfile.x

1 - primeiro configure o editor, no mycase vim exporte SVN_EDITOR = vim

2 - “svn propedit svn: ignore project / trunk /” abrirá um novo arquivo e você pode adicionar seus arquivos e subdiretórios em nosso caso, digite “target” salvar e fechar arquivos e obras

$ svn st? projeto / tronco / myfile.x

obrigado.

Bruno Lee
fonte