2009-09-23 11 views
6

Mam dużą aplikację w środowisku produkcyjnym, które próbuję przenieść pod kontrolą wersji. Stworzyłem więc nowe repozytorium i zaimportowałem aplikację, minus różne katalogi i pliki, które nie powinny być pod kontrolą wersji. Teraz muszę sprawić, aby zainstalowana kopia była kasowana (ale nadal zachowuje dodatkowe pliki). W tym momencie, w najnowszej wersji SVN, po prostu wykonam kasę nad istniejącym katalogiem przy użyciu opcji --force. Niestety, mam starą wersję SVN, wcześniej, kiedy dodano opcję --force (i nie można jeszcze uaktualnić ... długiej historii).Kopiowanie katalogów .svn z kasy do płatności niebędącej płatnością do realizacji.

Więc, sprawdziłem aplikację w innym katalogu i chcę po prostu skopiować wszystkie katalogi .svn do oryginalnego katalogu, zamieniając oryginał w kasę, pozostawiając w spokoju dodatkowe pliki. Teraz może po prostu mam ciężki dzień i brakuje mi czegoś, co jest w zwykłej witrynie, ale nie mogę tego zrozumieć. Oto sposoby próbowałem dotąd:

  1. użycie rsync: Nie mogę wydawać się trafić w odpowiednią kombinację włączać i wyłączać dyrektyw rekursywnie przechwytywanie wszystkich katalogów .svn ale nic więcej.

  2. Użyj cp: Nie mogę znaleźć dobrego sposobu na to, aby trafić wszystkie katalogi .svn w całej aplikacji.

  3. Użyj find z -exec cp: Występują problemy z wiodącą częścią ścieżek znalezionych plików zepsującymi ścieżki docelowe. Mogę wykluczyć to przy użyciu -printf "% P", ale nie wydaje się, że należy do {} zamiennika dla exec.

  4. Użyj find z xargs do cp: Występują problemy z wyszukiwaniem folderów podrzędnych przed wysłaniem ich rodziców. Niestety, find nie ma opcji -szeregu.

Jakieś myśli tam?

Inne info:

  • bash 3.0.0.14
  • rsync 2.6.3 p28
  • cp 5.2.1
  • svn 1.3.2
+0

Upewnij się, że pamiętasz, aby ustawić uprawnienia do folderów .svn, w przeciwnym razie może to być potencjalny exploit bezpieczeństwa. Ta strona wyjaśnia problem: http://www.adamgotterer.com/2009/01/26/hacking-the-svn-directory/ – Joshua

Odpowiedz

6

Użyj tar i znajdź, aby przechwycić katalogi .svn w czystym koszyku, a następnie odszukaj w swojej aplikacji.

cd /tmp/ 
svn co XXX 
cd XXX 
find . -name .svn -print0 | tar cf /tmp/XXX.tar --null -T - 
cd /to/your/app/ 
tar xf /tmp/XXX.tar 

Edit: przełączane polecenia find/tar używać NUL terminator dla solidności w obliczu nazw zawierających spacje. Oryginalne polecenie:

tar cf /tmp/XXX.tar $(find . -name .svn) 
+0

Wow, nie wiedziałem o składni $ (...) - zakładam, że jest to funkcja bash. Wydaje się to działać z wyjątkiem jednego problemu: pomija pliki/katalogi, które pojawiają się w powłoce, jako wiele tokenów (takich jak te ze spacjami w nazwie). Jak mogę zmodyfikować polecenie tar ... find, aby obsłużyć te nazwy? przykład nazwa pliku: "6 - foo" wyjściowa: $ tar-CF ~/testsvn.tar \ '$ (znaleźć -name .svn.) \' tar:”./6: Nie można stat : Brak takiego pliku lub katalogu tar: -: Can not stat: Brak takiego pliku lub katalogu tar: the: Can not stat: Brak takiego pliku lub katalogu tar: foo: Can not stat: Brak takiego pliku lub katalogu –

+0

Przepraszamy za bałagan komentarza - nie można wymyślić, jak wymusić podział wierszy w komentarzach. –

+0

Tak, $ (...) jest funkcją basha. Spacje w nazwach plików są obrzydliwe. Prawdopodobnie chcesz zamiast tego użyć czegoś takiego jak "find. -name .svn -print0 | tar cf /tmp/XXX.tar -T - --null". -print0 mówi find używać znaków separatora NUL zamiast nowej linii. -T- informuje tar o odczytaniu nazw plików ze standardowego wejścia, a --null mówi tar, aby używał znaków separatora NUL zamiast nowych znaków. – bstpierre

0

(5) Czy” po prostu dokonujesz płatności do innego katalogu, a następnie kopiujesz dodatkowe pliki do tego katalogu, czy przed przejściem do uruchamiania aplikacji z nowego katalogu wszystko jest w porządku?

+0

Niestety nie jest to zbyt dobra opcja, ponieważ lista dodatkowych plików ciągle się zmienia. aplikacja działa. –

Powiązane problemy