2009-09-04 23 views
10

Mam katalog w systemie Linux, który zawiera głównie dowiązania symboliczne do plików w innym systemie plików. Chciałbym dodać katalog do repozytorium Subversion, dereferencji dowiązań symbolicznych w procesie (traktując je jako pliki, które wskazują, a nie linki). Zasadniczo chciałbym móc obsługiwać wszelkie operacje kopii roboczej z tym zachowaniem, ale polecenie "svn add" jest tam, gdzie zaczyna się, jak sądzę.Czy klient Subversion (svn) może usuwać dowiązania symboliczne, tak jakby były plikami?

Narzędzie klienta SVN nie ma żadnych opcji związanych z dowiązaniem do dowiązań symbolicznych w kopii roboczej. Nie znalazłem w tym podręczniku żadnych odniesień (http://svnbook.red-bean.com/en/1.5/index.html).

znalazłem plakat na użytkowników SVN listy, która zadała to samo pytanie, ale nigdy nie otrzymałem odpowiedzi, tutaj mailowych:

(To plakat skończyło się dowiązania twarde zamiast dowiązania symboliczne Ta technika nie jest opcją, w moim przypadku, ponieważ rzeczywiste pliki źródłowe znajdują się w oddzielnym systemie plików.)

Używam Subversion v1.6.1 na Fedorze 11.

Co jest warte, wiem, że istnieją alternatywne narzędzia/techniki, które mogą pomóc w przybliżeniu tego zachowania, ale które muszę odrzucić z różnych powodów. Rozważałem już [i pyłu-binned] te możliwości: - "zjednoczenie" mount, łączenie wszystkich katalogów zawierających prawdziwe pliki, z katalogiem roboczym SVN jako "górną" warstwą w związku; - kopiowanie/przenoszenie rzeczywistych plików do tego samego systemu plików, co kopia robocza SVN, i używanie twardych linków zamiast dowiązań symbolicznych; - Systemy kontroli wersji inne niż SVN. To były zgrabne pomysły i jestem pewien, że są one dobrym rozwiązaniem innych problemów, ale nie będą działać z uwagi na ograniczenia tego środowiska i sytuacji.

+0

Po prostu nie sądzę, że to możliwe (i nie sądzę, żeby VCS mógł to zrobić, albo podąża za dowiązaniami symbolicznymi, ale nie może ich śledzić, albo śledzi je i nie śledzi). – tonfa

+0

Zaczyna wyglądać w ten sposób. Co wydaje się głupie, biorąc pod uwagę, że większość narzędzi, które manipulują konstrukcjami ścieżek (cp, mv, ln, rm, rsync) ma wszystkie opcje do określenia, że ​​dowiązania symboliczne powinny być dereferencjonowane, a nie traktowane dosłownie. Mam na myśli, czy to tylko ja, czy też brak opcji "dereferencji" zmniejsza funkcjonalność narzędzia? (Jeśli jestem tu sam, prawdopodobnie nie będę zawracał sobie głowy przesyłaniem zapytania o funkcję do projektu SVN.) –

+0

3 lata za późno, ale nie jesteś sam. Ja też tego potrzebuję. –

Odpowiedz

1

Masz wiele ograniczeń, ale jest jedna rzecz, która zawsze działa: zhakuj źródło.

Możesz łatwo zbudować własny svn dla systemu Linux, choć ten mod może być lub może nie być "łatwy". W każdym razie, jeśli nie masz żadnych zarządzanych dowiązań symbolicznych, możesz zrobić surowy hack i po prostu mieć svn za nimi zawsze, tak jakby były twardymi linkami.

Jeśli twoje repozytorium zawiera wersjonowane linki i musisz sprawdzić tę część, to potrzebujesz bardziej wyrafinowanego hacka, który, powiedzmy, używa właściwości, która kontroluje funkcję na plik lub hierarchię lub coś podobnego.

Może być jeszcze jeden wybór: wersjonowane odsyłacze pojawiły się w wersji 1.1.0, jeśli zachowanie poprzedzające to było podążaniem za dowiązaniami symbolicznymi, być może po prostu mógłbyś uruchomić starego klienta.

+0

Mówisz więc, że odpowiedź na moje prawdziwe pytanie (czy klient SVN może to zrobić) brzmi "nie". Dobrze? –

+1

Dobrze, mówię "nie, przynajmniej, nie od 1.1.0, a może nie wcześniej,". Przypuszczam, że zastanawiałeś się nad dodaniem innych drzew systemów plików, a następnie zachowaniem lokalnych niewersjonowanych dowiązań symbolicznych. Wydaje się, że działa to ładnie, z wyjątkiem wymagania więcej niż jednego zatwierdzenia lub aktualizacji do zsynchronizowania całej kopii roboczej. (Ale nie w innych kopiach roboczych bez lokalnych linków.) – DigitalRoss

0

Pomysł: wstrzyknij udostępnioną bibliotekę przy użyciu LD_PRELOAD, która przechwytuje stat/open/unlink itp., Aby svn nie widział dowiązań symbolicznych. To zaoszczędziłoby ci konieczności modyfikowania źródła svn.

0

Można również użyć fizycznych łączy zamiast dowiązań symbolicznych.

0

O ile mi wiadomo, z obecną wersją subversion (1.6.x) nie ma sposobu, aby to zrobić. W przypadku plików (nie katalogów) w tym samym systemie plików można było użyć twardych łączy (bez przełącznika -s w komendzie ln).

0

Zmierzyłem się z podobnym wyzwaniem. Mój katalog domowy zawiera wiele skryptów w ~/scripts rozrzuconych po różnych podkatalogach. Jednak chciałem czystszego układu w SVN, aby pomóc współpracownikom, którzy przeglądają rzeczy szukające przykładów kodu.

stworzyłem katalog ~/scripts/svn/signal15/code/ z prod i test podkatalogów pod spodem, następnie hard-linked wszystkie skrypty rozrzucone gdzie indziej.

Następujące polecenie następnie zaimportowało wymagany układ katalogu/pliku;

cd ~/scripts ; svn import svn http://svn_server/repos/code

repo pokazuje teraz http://svn_server/repos/code/signal15/ z "prod" i "test" podkatalogów.

Mam teraz niestandardowe układy; a) Układ mojego katalogu domowego pozostaje niezmieniony (sans ~/scripts/svn podkatalog) b) Repozytorium SVN zawiera gałąź "signal15" z moimi zorganizowanymi skryptami. P.S: Z funkcją powłoki, mogę również odprawić się i wymeldować w razie potrzeby.

Powiązane problemy