O que significa o símbolo de status do Subversion “~”?


110

Estou recebendo um símbolo de til quando faço um svn status.

Aqui está a saída do projeto após editá-lo no XCode.

svn status
M      build/Currency_Converter.build/Currency_Converter.pbxindex/imports.pbxbtree
M      build/Currency_Converter.build/Currency_Converter.pbxindex/pbxindex.header
M      build/Currency_Converter.build/Currency_Converter.pbxindex/symbols0.pbxsymbols
~      build/Currency_Converter.build/Currency_Converter.pbxindex/strings.pbxstrings
M      main.m
//more changed files

Alguma ideia do que isso significa? Não consigo encontrar no google ou em qualquer uma das folhas de dicas do svn.

Curiosamente, eu apenas editei o main.m, mas existem muitos arquivos modificados. Não sei por que isso seria. Alguém tem alguma dica para trabalhar com SVN e XCode? Devo apenas colocar meus arquivos de origem sob controle de versão?

Editar: - causado por um arquivo que já estava sob controle de versão sendo substituído por um arquivo de outro tipo. Nesse caso, strings.pbxstrings costumava ser um arquivo e agora se tornou um diretório. A moral da história é não colocar sua pasta de construção no controle de versão.


Hmm, não tenho certeza se há uma maneira de "consertar" isso, ao invés de apenas adicionar novamente. Você pode postar outra pergunta perguntando se há uma boa maneira de resolver esse status, você obteria mais atenção (já que a pergunta atual já foi respondida).
Chad Birch

Respostas:


88

O livro SVN diz:

O item é versionado como um tipo de objeto (arquivo, diretório, link), mas foi substituído por um tipo diferente de objeto.

Então, talvez fosse originalmente um único arquivo, mas você o mudou para um diretório ou algo parecido?


1
Parece que você está certo. Agora é um diretório sem um arquivo .svn. Alguma ideia de como consertar isso? Eu preciso excluí-lo do Subversion e adicioná-lo novamente?
jergason

alguma chance de você encontrar uma maneira de consertar isso?
Phill Pafford,

48
A melhor solução é renomear o novo objeto (no seu caso, o diretório); "svn remove" o objeto do repositório que está causando a colisão (provavelmente um arquivo que você excluiu), confirme, então renomeie o novo objeto de volta e "svn adicione" ao repositório. Comprometa-se novamente. Você terá uma sequência de 3 revisões onde o objeto antigo existia, foi removido e o novo objeto foi adicionado, respectivamente.
Brian Lacy

8
Caso alguém lendo este tópico tenha o mesmo problema: isso aconteceu comigo e a razão para o status '~' era que eu tinha alguns links simbólicos no repositório, que foram substituídos por arquivos padrão por uma operação 'sed -i' . Recriei os links simbólicos e o '~' foi embora.
jb

5
@JamieBullock A mesma coisa aconteceu comigo pelo mesmo motivo hoje. Tentei este comando antes mesmo de saber qual era o problema: svn status | grep ^~ | grep -o [^[:space:]]\*\$ | xargs svn revertele foi capaz de restaurar todos os links simbólicos.
Paul

34

Aqui está o que eu fiz:

Se a pasta for Test

  1. mv Test Test1
  2. svn remove Teste
  3. Teste mv Test1

5
Isso funcionou para mim, desde que eu me comprometesse entre remover e adicionar. 1. mv Test Test1 2. svn remove Teste 3. svn commit -m "Teste removido" 4. mv Test1 Teste 5. svn add Teste 6. svn commit -m "Teste adicionado"
Brandon Brodjeski 01 de

1
A resposta por @sancelot é muito melhor; você não precisa renomear se estiver usando svn delete --keep-local fileName.
DawnSong

15

De

svn help status

item versionado '~' obstruído por algum item de um tipo diferente

Eu só vi isso onde as permissões de arquivo foram alteradas e svn não tinha acesso de execução, eu acredito.

Espero que isto ajude.


12

A maneira mais fácil de consertar isso é fazer backup, excluir a pasta ou arquivo com este status e executar "svn up": não é necessariamente uma pasta substituída por um arquivo, pode ser apenas que a pasta .svn está ausente ou corrompida .


11
svn delete --keep-local x
svn commit -m "del x"
svn add x
svn commit -m "blah"

Não há necessidade de renomear. Você deu a melhor resposta.
DawnSong de

Melhor resposta! Isso corrige o problema. No meu caso, foi um link simbólico confirmado como um arquivo normal.

10

Isso pode acontecer quando você remove a pasta .svn em uma pasta (por exemplo, quando você remove um diretório e, em seguida, cria o mesmo diretório novamente), ou quando você substitui um diretório por um link simbólico ou um arquivo com o mesmo nome .

Supondo que seja uma pasta chamada de pasta, você pode corrigir isso emitindo os seguintes comandos na pasta pai:

$ find a-folder -type d -name '.svn' -print0 | xargs -0 rm -Rf
$ svn up --force .
svn: Directory 'logs/.svn' containing working copy admin area is missing
$ svn up --force .
E    a-folder
...
Updated to revision n.

E então é uma questão de svn adicionar / remover e confirmar as alterações novamente


3

Teve um problema semelhante, o SVN estava reclamando de um bloqueio. Aqui está o que fizemos:

  • Backup dos arquivos
  • Removido o diretório em questão com rm -r (linux)
  • Executou o svn cleanup no diretório
  • Executou svn up --force no diretório

3

Eu só quero compartilhar que este é um problema freqüentemente encontrado ao instalar extensões dentro do Joomla. As extensões são instaladas por meio do CMS e são propriedade do apache sem gravação em grupo. Geralmente, a próxima etapa é adicionar os arquivos ao SVN, mas se você não fizer sudo ou alterar as perms do arquivo, o SVN falhará quando não puder gravar o diretório .svn. Aqui está a solução fácil.

mv foo foo-bak
svn up foo
svn revert foo

# just for good measure. Foo should not show up in the two following commands.
ls | grep foo
svn st | grep foo

mv foo-bak foo
svn add foo

2

Também pode ser uma questão de links simbólicos no Windows. Quando você confirma um link simbólico no SVN e o verifica no Windows, os links são alterados para arquivos regulares e isso também é relatado como ~.


1
Então, como você conserta isso?

2

Eu costumava fazer isso durante a atualização de módulos (por exemplo.) Joomla !, Wordpress ou Drupal. Às vezes, o diretório .svn é removido pelo processo de atualização.

# rename updated directory
mv foo foo.new

# restore the old directory
svn up foo

# merge / update the old directory with new items
# notice that the above command will preserve the obsolete files
# so you should do a diff -r in order to remove them
cp -r foo.new/* foo

# Add files commit, etc
svn add foo/*
svn delete foo/xx
svn commit -m "updated module"

0
~ versioned item obstructed by some item of a different kind
    Second column: Modifications of a file's or directory's properties
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.