Remova as propriedades desnecessárias do svn: mergeinfo

136

Quando eu mesclar coisas no meu repositório, o Subversion deseja adicionar / alterar muitas svn:mergeinfopropriedades de arquivos totalmente não relacionados às coisas que eu quero mesclar.

Perguntas sobre esse comportamento foram feitas antes aqui no Stack Overflow:

Pelo que entendi nos tópicos mencionados acima, parece que muitos arquivos no meu repositório têm svn:mergeinfopropriedades explícitas , quando não deveriam. O conselho é reduzir a quantidade e colocar apenas essas propriedades em arquivos / pastas relevantes.

Então agora minha pergunta: como posso remover facilmente essas propriedades desnecessárias? Estou usando o TortoiseSVN, mas reluto em verificar / corrigir manualmente centenas de arquivos. Existe uma maneira mais fácil de remover essas svn:mergeinfopropriedades desnecessárias ?

PS Eu estou não olhando para o código API C ++ SVN.

LeonZandman
fonte

Respostas:

142

Aqui está outra maneira de excluir todas as propriedades da subárvore svn: mergeinfo, mas não na pasta raiz (isso é necessário para que a ramificação funcione corretamente).

Na raiz do projeto, faça:

svn propdel svn:mergeinfo -R
svn revert .
svn ci -m "Removed mergeinfo"
Vincent
fonte
57
Ou, simplesmente não fazê-lo no diretório raiz "svn propdel -R svn: mergeinfo ./*"
JeremyWeir
3
"svn propdel -R svn: mergeinfo ./* ./.[^.*" "se você também possui" ponto "/ * ix arquivos ocultos, provavelmente não é um problema para um usuário do Windows de acordo com a pergunta.
Peter
3
suprimir a saída acelera: "svn propdel svn: mergeinfo -R> nul" (ou> / dev / null usando Linux)
bebbo 20-14
2
@ JeremyWeir O que você quer dizer com "simplesmente não faça isso no diretório raiz"? De onde então? Você tem muitos votos positivos nesse comentário, mas não estou vendo a alternativa.
TT.
3
@TT. Eu acho que a idéia é apenas ir para o diretório que possui todas as informações de mesclagem desordenadas e fazê-lo a partir daí, para que você não precise reverter o diretório raiz. Você não quer mexer com a mergeinfo da raiz.
JeremyWeir
15

Aqui está uma maneira de excluir todas as propriedades da subárvore svn: mergeinfo. Execute-o dentro da raiz do seu repositório:

svn propget svn:mergeinfo --depth=infinity 
    | grep -v "^/"
    | grep -v "^\."   
    | cut -d- -f1 
    | xargs svn propdel svn:mergeinfo

Tudo em uma linha para facilitar a cópia / colar:

svn propget svn:mergeinfo --depth=infinity | grep -v "^/" | grep -v "^\." | cut -d- -f1 | xargs svn propdel svn:mergeinfo

Para visualizar quais arquivos isso afetará antes de executá-lo, altere o último "propdel" para "propget" ou remova o último canal xargs completamente.

Kelvin
fonte
2
Funciona com hífens nos arquivos: svn propget -R svn: mergeinfo | grep -v "^ /" | grep -v "^ \." | corte "-d" -f1 | xargs svn propdel svn: mergeinfo
Squirrel
12

Conforme mencionado neste tópico :

  • A maioria das mergeinfo vazias ("em branco") pode ser causada pela cópia de trabalho para cópias / movimentos de cópia de trabalho onde o item de origem não possui informações de mesclagem explícitas. Usar propdel pode ser a solução, a menos que você esteja usando um SVN 1.6: desde a 1.5.5, essas cópias de WC para WC não criam mais mergeinfo vazio no destino
  • uma operação de reestruturação svn move (renomear) anterior também pode propagar mergeinfo, em vez de deixá-los no diretório raiz
  • existe um problema de memória em potencial, rastreado pelo caso 3393, que será corrigido na próxima versão 1.6.2 e portado na versão 1.5
VonC
fonte
6

Como não tenho confiança em cegos svn:merge-info exclusão propriedades, implementei uma ferramenta para analisar a situação atual em uma cópia de trabalho e remover o máximo possível de revisões de mesclagem das propriedades de informações de mesclagem não raiz. Após verificações e controles humanos adicionais, as alterações na cópia de trabalho podem ser confirmadas.

Aqui está: svn-clean-mergeinfo

Não hesite em relatar qualquer problema sobre seu uso para melhorá-lo.

O Subversion 1.10 apresenta uma nova ferramenta dedicada a essa tarefa: svn-mergeinfo-normalizer

Yves Martin
fonte
2
Essa ferramenta é ótima para consolidar propriedades de informações de mesclagem, como os tipos criados com mesclagens de subdiretórios parciais que muitos desenvolvedores menos do que perfeitamente coordenados em uma grande equipe podem criar. A ferramenta parece ter um problema com os arquivos que não existem em todas as ramificações. Recebo as propriedades de informações de mesclagem restantes nos arquivos que indicam revisões nas ramificações nas quais o arquivo nunca existiu.
Davidpcj
Concordo que não é perfeito ... é por isso que "controles e verificações humanas" ainda são necessários. No seu caso, se você tiver identificado revisões não relevantes nas propriedades de informações de mesclagem, poderá remover essas revisões ou toda a propriedade svn: merge-info desses arquivos antes de confirmar. Por favor, use o github para solicitar melhorias.
Yves Martin
4

Sei que já faz um tempo, mas tive um problema semelhante. Estou usando o TortoiseSVN 1.6.7. Aconteceu que a propriedade estava na raiz da minha cópia de trabalho. Quando eu vi as propriedades na raiz e clicou em Remover no svn: mergeinfo, ele me perguntou se eu quero removê-lo recursivamente. Isso livrou-se de todas as minhas configurações svn: mergeinfo.

moribvndvs
fonte
Eu estava na mesma situação. Trabalhou para mim. Obrigado!
andrewd18
2

Se tiver certeza de que deseja remover em massa as propriedades do mergeinfo, use o seguinte script BASH.

FILES=`svn status |grep "^ M      " |sed s/" M      "// |tr '\n', ' '`
svn revert $FILES

Ele obtém uma lista de arquivos alterados, filtra para apenas mesclar informações, muda tudo, retira tudo, exceto o caminho real do arquivo, converte os caminhos de uma por linha em uma lista delimitada por espaço e as chamadas são revertidas nessa lista.

Chase Seibert
fonte
2
Thanx, mas como você pode ter sabido de mim mencionar TortoiseSVN Eu sou um usuário do Windows e não use o shell Bash :-)
LeonZandman
O mesmo deve ser possível no DOS, embora provavelmente não seja tão conciso.
Chase Seibert
1
Isso não reverte apenas arquivos com mergeinfo modificado no diretório de trabalho atual? Nesse caso, ele não soluciona o problema: o mergeinfo explícito existente. Para isso, você precisaria apoiar.
Dominic Scheirlinck
2
Isso é bastante complicado - tem um nome de arquivo com espaço em branco no nome? Com caracteres glob em seu nome? Más notícias em ambos os casos. A maneira aprovada / suportada de analisar a saída do status svn está usando o --xmlsinalizador e um analisador XML; qualquer outra coisa pode mudar entre as versões, pois a compatibilidade avançada no formato de saída de texto não é garantida.
Charles Duffy
2

Em vez de excluir cegamente as propriedades mergeinfo, também é possível concluir as mesclagens "ausentes".

Copie a propriedade mergeinfo da pasta raiz e execute uma mesclagem na pasta filha para o caminho relativo apropriado e a mesma lista de revisão exata. (Você pode, mas não precisa, apenas listar as diferenças entre essa lista e a que já está na pasta filha.)

Normalmente, essa mesclagem deve acabar apenas alterando as propriedades de mergeinfo, e não os arquivos reais. (Se acabar alterando os arquivos, uma das mesclagens anteriores deve ter sido apenas uma mesclagem parcial, o que pode estar causando problemas de qualquer maneira.)

Fazer isso deve excluir a propriedade mergeinfo para você, depois que você conseguir que os dois correspondam exatamente. Você também pode fazer o inverso: mesclar na raiz as revisões de mesclagem presentes apenas na pasta filho (novamente, basta colar a lista completa e deixar o SVN resolver as diferenças para você).

Miral
fonte
1

Para fazer alterações em uma estrutura de diretórios, isso seria (apenas 'find' não-DOS):

find . -path "*/.svn" -prune -or -exec svn propdel svn:mergeinfo '{}' \;

Executando um cliente 1.6.12 conectado a um servidor 1.5, eu tenho um problema semelhante; não é um subdiretório no projeto que precisa de sua própria svn: mergeinfo, mas ter 121 tais entradas (incluindo 5 diretórios abaixo ./var com "svn: ignore *") parece um pouco inapropriado. Portanto, seria bom ter um script (por exemplo, Python) capaz de remover as informações de mesclagem obviamente supérfluas e falar sobre outras diferenças ...

Tobias
fonte