Co oznacza symbol statusu Subversion „~”?


110

Otrzymuję symbol tyldy, kiedy wykonuję svn status.

Oto wynik projektu po edycji w 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

Masz jakiś pomysł, co to znaczy? Wydaje się, że nie można go znaleźć w Google ani w żadnym z ściągów svn.

Co ciekawe, edytowałem tylko main.m, ale jest dużo zmodyfikowanych plików. Nie wiem, dlaczego miałoby to być. Czy ktoś ma jakieś wskazówki dotyczące pracy z SVN i XCode? Czy powinienem umieszczać tylko pliki źródłowe pod kontrolą wersji?

Edycja: - spowodowana zastąpieniem pliku, który był już pod kontrolą wersji, plikiem innego typu. W tym przypadku strings.pbxstrings był plikiem, a teraz stał się katalogiem. Morał z tej historii jest taki, że nie należy poddawać folderu kompilacji kontroli wersji.


Hmm, nie jestem pewien, czy istnieje sposób, aby to „naprawić”, w przeciwieństwie do zwykłego ponownego dodawania. Możesz zadać kolejne pytanie z pytaniem, czy istnieje dobry sposób rozwiązania tego problemu, aby uzyskać więcej uwagi (ponieważ na bieżące pytanie jest już odpowiedź).
Chad Birch

Odpowiedzi:


88

SVN Książka mówi:

Element jest wersjonowany jako jeden rodzaj obiektu (plik, katalog, link), ale został zastąpiony innym rodzajem obiektu.

Więc może pierwotnie był to pojedynczy plik, ale zmieniłeś go na katalog lub coś podobnego?


1
Wygląda na to, że masz rację. Jest to katalog bez pliku .svn. Masz jakiś pomysł, jak to naprawić? Czy muszę go usunąć z Subversion i dodać ponownie?
jergason

jest szansa, że ​​znalazłeś sposób, aby to naprawić?
Phill Pafford

48
Najlepszym rozwiązaniem jest zmiana nazwy nowego obiektu (w twoim przypadku katalogu); „svn remove” obiekt z repozytorium, który powoduje kolizję (prawdopodobnie plik, który usunąłeś), zatwierdź, a następnie zmień nazwę nowego obiektu z powrotem i „svn dodaj” go do repozytorium. Zatwierdź ponownie. Będziesz mieć sekwencję 3 wersji, w których stary obiekt istniał, został usunięty, a nowy obiekt został dodany.
Brian Lacy

8
Na wypadek, gdyby ktoś czytający ten wątek miał ten sam problem: przydarzyło mi się to, a przyczyną statusu '~' było to, że miałem kilka dowiązań symbolicznych w repozytorium, które zostały nadpisane przez standardowe pliki przez operację 'sed -i' . Odtworzyłem dowiązania symboliczne i znak „~” zniknął.
jb

5
@JamieBullock To samo spotkało mnie dzisiaj z tego samego powodu. Wypróbowałem to polecenie, zanim jeszcze zorientowałem się, na czym polega problem: svn status | grep ^~ | grep -o [^[:space:]]\*\$ | xargs svn revertktóry był w stanie przywrócić wszystkie dowiązania symboliczne.
Paul,

34

Oto co zrobiłem:

Jeśli folder to Test

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

5
To działało dla mnie, dopóki zobowiązałem się między usunięciem a dodaniem. 1. mv Test Test1 2. svn remove Test 3. svn commit -m "Removed Test" 4. mv Test1 Test 5. svn add Test 6. svn commit -m "Added Test"
Brandon Brodjeski

1
Odpowiedź @sancelot jest znacznie lepsza; nie musisz zmieniać nazwy, jeśli używasz svn delete --keep-local fileName.
DawnSong

15

Z

svn help status

„~” wersjonowany element zasłonięty przez element innego rodzaju

Widziałem to tylko wtedy, gdy uprawnienia do pliku uległy zmianie, a svn nie miał dostępu do niego, jak sądzę.

Mam nadzieję że to pomoże.


12

Najłatwiejszym sposobem rozwiązania tego problemu jest utworzenie kopii zapasowej, a następnie usunięcie folderu lub pliku, który ma ten stan, a następnie wykonanie „svn up”: niekoniecznie jest to folder zastąpiony przez plik, może to być po prostu brak folderu .svn lub jego uszkodzenie .


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

Nie ma potrzeby zmiany nazwy. Dałeś najlepszą odpowiedź.
DawnSong

Najlepsza odpowiedź! To rozwiązuje problem. W moim przypadku był to miękki link zatwierdzony jako zwykły plik.

10

Może się to zdarzyć, gdy usuniesz folder .svn w folderze (na przykład, gdy usuniesz katalog, a następnie ponownie utworzysz ten sam katalog) lub gdy zastąpisz katalog dowiązaniem symbolicznym lub plikiem o tej samej nazwie .

Zakładając, że jest to folder o nazwie a-folder, możesz to naprawić, wydając następujące polecenia w folderze nadrzędnym:

$ 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.

A potem jest kwestia dodania / usunięcia svn i ponownego zatwierdzenia zmian


3

Miał podobny problem, SVN narzekał na zamek. Oto, co zrobiliśmy:

  • Utworzono kopię zapasową plików
  • Usunięto katalog, o którym mowa, poleceniem rm -r (linux)
  • Ran oczyszczanie svn w katalogu
  • Uruchomiono svn up --force w katalogu

3

Chcę tylko powiedzieć, że jest to problem często napotykany podczas instalowania rozszerzeń w Joomla. Rozszerzenia są instalowane przez CMS i są własnością Apache bez zapisu grupowego. Generalnie następnym krokiem jest dodanie plików do SVN, ale jeśli nie wykonasz sudo lub nie zmienisz uprawnień do pliku, SVN zawiedzie, gdy nie będzie mógł zapisać katalogu .svn. Oto proste rozwiązanie.

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

Może to być również kwestia dowiązań symbolicznych w systemie Windows. Kiedy zatwierdzasz dowiązanie symboliczne do SVN, a następnie sprawdzasz to w systemie Windows, łącza są zmieniane w zwykłe pliki i jest to również zgłaszane jako ~.


1
Jak więc to naprawić?

2

Często miałem to podczas aktualizacji modułów pod (np.) Joomla !, Wordpress czy Drupal. Czasami katalog .svn jest usuwany podczas procesu aktualizacji.

# 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.