Pobierz jeden plik z Subversion


320

„Nie można wyewidencjonować pojedynczego pliku. Najlepszy poziom realizacji transakcji, jaki można wykonać, to poziom katalogu”.

Jak obejść ten problem podczas korzystania z Subversion?

Mamy ten folder w Subversion, w którym przechowujemy wszystkie nasze obrazy. Chcę tylko sprawdzić jeden plik (obraz) z tego. Ten folder jest naprawdę duży i zawiera mnóstwo innych rzeczy, których nie potrzebuję teraz.


Możesz to zrobić w drugą stronę. Zaloguj się do serwera produkcyjnego i svn updo lokalnego katalogu na swoim komputerze.
Neocortex,

Odpowiedzi:


403

Prostą odpowiedzią jest to, że masz svn exportplik zamiast go sprawdzać.

Ale to może nie być to, czego chcesz. Możesz popracować nad plikiem i sprawdzić go ponownie, bez konieczności pobierania niepotrzebnych śmieci.

Jeśli masz Subversion 1.5+, wykonaj rzadkie wypłaty:

svn checkout <url_of_big_dir> <target> --depth empty
cd <target>
svn up <file_you_want>

W przypadku starszej wersji SVN możesz skorzystać z następujących opcji:

  • Sprawdź katalog, korzystając z wersji z odległej przeszłości, kiedy był mniej pełen śmieci, których nie potrzebujesz.
  • Zaktualizuj żądany plik, aby utworzyć mieszaną wersję. Działa to nawet wtedy, gdy plik nie istniał w sprawdzonej wersji.
  • Zysk!

Alternatywą (na przykład, jeśli katalog zawiera zbyt wiele śmieci bezpośrednio od wersji, w której został utworzony) jest wykonanie kopii URL-> URL pliku, który chcesz w nowym miejscu w repozytorium (w rzeczywistości jest to działająca gałąź pliku). Sprawdź ten katalog i dokonaj modyfikacji.

Nie jestem pewien, czy możesz następnie scalić zmodyfikowaną kopię z powrotem w repozytorium bez roboczej kopii celu - nigdy nie potrzebowałem. Jeśli tak, to zrób to.

Jeśli nie, możesz niestety znaleźć kogoś, kto ma cały katalog wyewidencjonowany i zmusić go do zrobienia tego. A może do czasu wprowadzenia modyfikacji reszta zakończy pobieranie ...


13
Naprawdę prostym rozwiązaniem jest dostęp do repozytorium za pomocą przeglądarki internetowej.
dolmen

11
@dolmen - Być może zakładając, że nie trzeba modyfikować pliku (i zakładając, że dla tego repozytorium działa interfejs WWW). Używam SVN z wiersza poleceń, więc dla mnie jest łatwiejszy w użyciu svn exportniż w interfejsie internetowym, jeśli wiem, jakiego pliku chcę. Pytający używa już SVN, więc myślę, że zależy to od tego, jakiego klienta i czy ten klient ułatwia korzystanie z niego svn export. Uważam, że interfejs sieciowy jest lepszy do przeglądania niż svn ls:-)
Steve Jessop

2
Klient SmartSVN zablokuje poszczególne pliki, jeśli serwer Subversion je obsługuje. Są też haki, które wymagają wyewidencjonowania, zanim plik binarny / plik wykonywalny będzie mógł zostać wpisany. Naprawdę nie ma sensu, aby dwie osoby modyfikowały grzywnę binarną i scalały zmiany. Mogą to być nowe funkcje, które nie były dostępne po zadaniu tego pytania.
TamusJRoyce,

@Tamus: Zgodzono się, że „to nie ma sensu”, ale w przypadkach, które opisuję, scalanie polega na przywróceniu nowej wersji do pierwotnej lokalizacji. Nie oczekuje się, że plik binarny został zmodyfikowany w celu scalania. Tak więc sam plik nie wymaga „scalania” poza zastąpieniem starej wersji nową, tak go nazywa SVN i rejestruje, skąd pochodzą zmiany w celu późniejszego wykorzystania. Masz rację, unikanie konfliktu można wymusić, blokując plik na czas trwania.
Steve Jessop

1
TortoiseSVN może sprawdzać pojedyncze pliki. Wierzę, że robi to samo za kulisami, aby to osiągnąć.
Mike Starov

109

Spróbuj svn exportzamiast svn checkout. To działa na pojedyncze pliki.

Powodem tego ograniczenia jest to, że checkouttworzy kopię roboczą, która zawiera meta-informacje o repozytorium, rewizji, atrybutach itp. Metadane są przechowywane w podkatalogach o nazwie „.svn”. A pojedyncze pliki nie mają podkatalogów.


2
Uwaga: bardzo stare wersje svnnie będą eksportować pojedynczych plików.
Mladen Jablanović

5
Jest to najlepsza metoda, jeśli chcesz pobrać najnowszą wersję konkretnego skryptu w ramach wdrożenia lub coś w tym rodzaju.
william.berg,

2
To zastrzeżenie było trudne nawet w 2011 roku, ale bardzo stare wersje mogą to zrobić svn cat $url_to_file_in_repo > $local_file_name.
cprn

53

Użyj svn catlub svn export.

W tym celu nie musisz pobierać katalogu roboczego, ale nie będziesz mógł zatwierdzić wprowadzonych zmian. Jeśli chcesz wprowadzić zmiany i zatwierdzić je, potrzebujesz katalogu roboczego, ale nie musisz go całkowicie pobierać. Sprawdź wersję, w której katalog był nadal / prawie pusty, a następnie użyj „svn cat”, aby wyodrębnić plik z HEAD.


svn cat svn://.../my_file.txtbyło dokładnie tym, czego szukałem. Pracuję w svn://jedynym (nie http://) repozytorium i wygląda na to, że najnowsze interfejsy websvn nie zapewniają pobierania surowego pliku (lub mamy go źle skonfigurowane lub jestem niewidomy). Łatwiej to zrobić niż checkout+ uptylko w celu pobrania pliku.
ribamar

12

Jeśli chcesz wyświetlić plik readme.txt w repozytorium bez sprawdzania go:

$ svn cat http://svn.red-bean.com/repos/test/readme.txt
To jest plik README. Powinieneś to przeczytać.

Wskazówka: Jeśli twoja kopia robocza jest nieaktualna (lub masz lokalne modyfikacje) i chcesz zobaczyć wersję HEAD pliku w kopii roboczej, svn cat automatycznie pobierze wersję HEAD, gdy podasz jej ścieżkę:

$ cat foo.c
Ten plik jest w mojej lokalnej kopii roboczej i zawiera zmiany, które wprowadziłem.

$ svn cat foo.c
Najnowsza wersja prosto z repozytorium!

Źródło


Możesz także bezpośrednio użyć dowolnego klienta HTTP. Twoja przeglądarka internetowa lub narzędzie wiersza polecenia, takie jak curllub wget.
dolmen

9

Poniżej przedstawiono równoważne rozwiązanie TortoiseSVN z zaakceptowaną odpowiedzią (napisałem to w wewnętrznym dokumencie dla mojej firmy, ponieważ nowo przyjmujemy SVN). Pomyślałem, że warto również udostępnić tutaj:

Sprawdzanie pojedynczego pliku: Subversion nie obsługuje pobierania pojedynczego pliku, obsługuje tylko pobieranie struktur katalogów. (Odwołanie: http://subversion.tigris.org/faq.html#single-file-checkout ). Wynika to z faktu, że przy każdym katalogu wyewidencjonowanym jako kopia robocza metadane dotyczące modyfikacji / wersji pliku są przechowywane jako wewnętrzny ukryty folder (.svn / _svn). To nie jest obecnie obsługiwane (v1.6) dla pojedynczych plików.

Alternatywna zalecana strategia: będziesz musiał wykonać część katalogu kasy tylko raz, po czym możesz bezpośrednio przejść do kasy pojedynczych plików. Wykonaj rzadkie pobieranie folderu nadrzędnego i struktury katalogów. Rzadkie pobieranie polega na sprawdzeniu tylko struktury folderów bez zapełniania plików zawartości. Kasujesz więc tylko struktury katalogów i nie musisz kasować WSZYSTKICH plików, co było przedmiotem zainteresowania. Odniesienie: http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-checkout.html

Krok 1 : Przejdź do przeglądarki repozytorium

Krok 2 : Kliknij prawym przyciskiem myszy folder nadrzędny w repozytorium zawierający wszystkie pliki, nad którymi chcesz pracować, i wybierz Zamówienie.

Krok 3 : W nowym wyskakującym oknie upewnij się, że katalog kasy wskazuje prawidłową lokalizację na komputerze lokalnym. Pojawi się również menu rozwijane z etykietą „głębokość kasy”. Wybierz „Tylko ten element” lub „Natychmiastowe dzieci, w tym foldery”, w zależności od wymagań. Druga opcja jest zalecana, ponieważ jeśli chcesz pracować nad zagnieżdżonym folderem, możesz przejść bezpośrednio następnym razem, w przeciwnym razie będziesz musiał ponownie wykonać całą procedurę dla zagnieżdżonego folderu.

Krok 4 : Foldery nadrzędne powinny być teraz dostępne w folderze wybranym lokalnie i są teraz monitorowane za pomocą SVN (ukryty folder „.svn” lub „_svn” powinien być teraz obecny). Teraz w repozytorium kliknij prawym przyciskiem myszy pojedynczy plik, który chcesz wyewidencjonować sam, i wybierz opcję „Aktualizuj element do wersji”. Można teraz pracować nad pojedynczym plikiem i wrócić do repozytorium.

Mam nadzieję, że to pomoże.


8

Możesz to zrobić w dwóch krokach:

  1. Kasy puste repozytorium SVN zawierające tylko meta informacje:

    $ cd /tmp
    
    $ svn co --depth empty http://svn.your.company.ca/training/trunk/sql
    
  2. Uruchom, svn upaby zaktualizować określony plik:

    $ svn up http://svn.your.company.ca/training/trunk/sql/showSID.sql
    

6

Aktualizacja na wypadek, gdyby to, czego naprawdę potrzebujesz, mogło zostać pokryte poprzez włączenie pliku do kasy innego folderu.

Od wersji SVN 1.6 możesz tworzyć zewnętrzne pliki , rodzaj linków svn. Oznacza to, że możesz mieć inny wersjonowany folder, który zawiera pojedynczy plik. Możliwe jest także zatwierdzanie zmian w pliku podczas pobierania tego folderu.

To bardzo proste, sprawdź folder, w którym chcesz dołączyć plik, i po prostu dodaj właściwość do folderu

svn propedit svn:externals .

o treści takiej jak ta:

file.txt /repos/path/to/file.txt

Po zatwierdzeniu plik pojawi się w przyszłych kasach tego folderu. Zasadniczo to działa, ale istnieją pewne ograniczenia, jak opisano w dokumentacji połączonej powyżej.


4

Przejdź do przeglądarki repo, kliknij prawym przyciskiem myszy plik i użyj „Zapisz jako”, ale używam TortoiseSVN.


4
cd C:\path\dir
svn checkout https://server/path/to/trunk/dir/dir/parent_dir--depth empty
cd C:\path\dir\parent_dir
svn update filename.log

(Edytuj plik.log)

svn commit -m "this is a comment."

4

Odpowiedź Steve'a Jessopa nie zadziałała dla mnie. Czytam pliki pomocy dla SVN i jeśli masz tylko obraz, prawdopodobnie nie chcesz go ponownie zameldować, chyba że robisz Photoshop, więc eksport jest lepszym poleceniem niż pobieranie, ponieważ jest niewersjonowany (ale jest niewielki).

A ARG --depth nie powinno być puste, ale pliki, aby uzyskać pliki w bezpośrednim katalogu. Otrzymasz wszystkie pola, nie tylko jedno, ale puste zwróci nic z repozytorium.

 svn co --depth files <source> <local dest>

lub

svn export --depth files <source> <local dest>

Jeśli chodzi o inne odpowiedzi, cat pozwala ci czytać treści, które są dobre tylko dla tekstu, a nie obrazów wszystkich rzeczy.


1
Chodziło o --depth emptyto, że inne pliki nie powinny być wyewidencjonowane, a następnie możesz uzyskać tylko jeden plik za pomocą svn up <source/file>. Dzięki svn exportnie musisz tego robić, wystarczy podać plik.
Kevin Vermeer

@reemrevnivek - masz rację. cóż, pytanie, które właśnie zadałem dla jednego pliku, działa to bez wyewidencjonowywania całego pliku struktury katalogów, nawet jeśli jest on pusty.
Vass

4

Po prostu przejrzę go i wyeksportuję pojedynczy plik. Jeśli masz dostęp HTTP, po prostu użyj przeglądarki internetowej, aby znaleźć plik i pobrać go.

Jeśli musisz odzyskać go po edycji, może to być nieco bardziej nużące, ale jestem pewien, że może istnieć svn importfunkcja ...


3

Zrób coś takiego:

mkdir <your directory>/repos/test

svn cat http://svn.red-bean.com/repos/test/readme.txt > <your directory>/repos/test/readme.txt

Zasadniczo chodzi o utworzenie katalogu, w którym chcesz pobrać plik z SVN. Użyj svn catpolecenia i przekieruj dane wyjściowe do tego samego pliku o nazwie. Domyślnie kot zrzuca informacje na stdio.



2

Dzięki Subversion 1.5 możliwe jest wyewidencjonowanie (wszystkich) plików katalogu bez sprawdzania żadnych podkatalogów (różne flagi --depth). Nie do końca to, o co prosiłeś, ale forma „mniej niż wszyscy”.


2

Korzystając z techniki rzadkiego wyewidencjonowywania, możesz sprawdzić konkretny plik, który został już wyewidencjonowany lub istnieje ... za pomocą prostej sztuczki:

Po wyewidencjonowaniu najwyższego poziomu repozytorium przy użyciu opcji „tylko ten element” w Eksploratorze Windows MUSISZ najpierw kliknąć prawym przyciskiem myszy plik, który chcesz zaktualizować; wybierz Repo Browser w menu kontekstowym; znajdź ten plik PONOWNIE w przeglądarce repozytorium i kliknij prawym przyciskiem myszy. Powinieneś teraz zobaczyć „aktualizuj element do wersji” w menu kontekstowym.

Nie jestem pewien, czy jest to funkcja nieudokumentowana, czy po prostu błąd. Znalezienie tej sztuczki zajęło mi dłuższe godziny po pracy. Używam TortoiseSVN 1.6.2.


2

Chciałem pobrać pojedynczy plik do katalogu, który nie był częścią kopii roboczej.

Pobierzmy plik pod następującym adresem URL: http: //subversion.repository.server/repository/module/directory/myfile

svn co  http://subversion.repository.server/repository/module/directory/myfile /**directoryb**

Więc sprawdziłem podany katalog zawierający plik docelowy, który chciałem dostać do katalogu fikcyjnego (powiedz etcb dla adresu URL kończącego się na /etc).

Następnie opróżniłem plik .svn / wpisy ze wszystkich plików katalogu docelowego, których nie potrzebowałem, aby zostawić tylko żądany plik. W tym pliku .svn / wpisy masz rekord dla każdego pliku z jego atrybutami, więc zostaw tylko rekord dotyczący pliku, który chcesz pobrać i zapisać.

Teraz wystarczy skopiować plik „.svn” do katalogu, który będzie nową „kopią roboczą”. Następnie wystarczy:

cp .svn /directory
cd /directory
svn update myfile

Teraz katalog katalogu jest pod kontrolą wersji. Nie zapomnij usunąć katalogu directoryb, który był tylko „tymczasową kopią roboczą”.


Czy nie to robi rzadka kasa? Naprawdę nie powinieneś ręcznie hakować plików w katalogu .svn.
Lasse V. Karlsen

Być może, ale rozwiązało to problem poprawnie. Podejrzewam, że tak powinien działać zarządzanie wersjami, a także możliwość obsługi plików jako rozszerzenia katalogów. Spróbuj i powiedz mi, co jest nie tak z logiką. Chciałbym zasugerować zespołowi deweloperów Subversion, aby rozszerzył narzędzie svn o tę funkcję, rozwiązałoby to problemy wszystkich facetów, którzy odpowiedzieli na ten wątek.
hendergassler

2

Ponieważ żadna z pozostałych odpowiedzi nie działała dla mnie, zrobiłem to przy użyciu tego hacka:

$ cd /yourfolder
svn co https://path-to-folder-which-has-your-files/ --depth files

Spowoduje to utworzenie nowego folderu lokalnego zawierającego tylko pliki ze zdalnej ścieżki. Następnie możesz zrobić symboliczny link do plików, które chcesz tutaj mieć.


OP poprosił o svn cojeden plik, aby uniknąć całego katalogu pełnego plików graficznych. Ponadto dodanie dowiązania symbolicznego może tylko zwiększyć złożoność, przejście z katalogu tymczasowego może działać, ale nadal musisz sprawdzić cały katalog zdjęć tylko dla jednego obrazu. @ steve-jessop miał dobry pomysł
Chris Marotta

2
@ChrisMarotta OP zadał pytanie 9 lat temu. Nikt tutaj nie odpowiada na OP. To jest ogólny temat tego rodzaju problemów i nie ma już nic wspólnego z pierwotnym OP. Ludzie przyjeżdżają tutaj, aby znaleźć rozwiązanie swojego problemu. A kiedy go przeczytają, niektórzy z nich znajdą się w mojej sytuacji, w której było to jedyne właściwe rozwiązanie. Dlatego to opublikowałem.
Lacho Tomov

1
Cieszę się z tej odpowiedzi, pomogła mi
Leos Literak

1

Ten problem obejmuje:

http://subversion.tigris.org/issues/show_bug.cgi?id=823

Dołączony jest skrypt, który pozwala wyewidencjonować pojedynczy plik z svn, wprowadzić zmiany i zatwierdzić zmiany z powrotem do repozytorium, ale nie można uruchomić polecenia „svn up”, aby pobrać resztę katalogu. Został przetestowany z svn-1.3, 1.4 i 1.6.


1

Jeśli chcesz tylko wyeksportować plik i nie będziesz musiał go później aktualizować, możesz to zrobić bez konieczności używania poleceń SVN.

Za pomocą przeglądarki repozytorium TortoiseSVN wybierz plik, kliknij prawym przyciskiem myszy, a następnie wybierz „ Kopiuj adres URL do schowka ”. Wklej ten adres URL do przeglądarki, a po zalogowaniu pojawi się monit o pobranie pliku.

W ten sposób możesz również wybrać żądaną wersję i pobrać starszą wersję pliku.

Pamiętaj, że jest to ważne, jeśli serwer SVN ma interfejs sieciowy.

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.