Jeśli usunę plik w Subversion, jak mogę przejrzeć jego historię i zawartość? Jeśli spróbuję to zrobić svn cat
lub svn log
na nieistniejącym pliku, narzeka, że plik nie istnieje.
Poza tym, jeśli chcę wskrzesić plik, czy powinienem svn add
go po prostu przywrócić?
(Zapytałem konkretnie o Subversion, ale chciałbym również usłyszeć, jak firmy Bazaar, Mercurial i Git radzą sobie również w tej sprawie.)
svn
version-control
bazaar
Benjamin Peterson
źródło
źródło
Jeśli chcesz spojrzeć na stare pliki, naprawdę powinieneś znać różnicę między:
i
Pierwsza wersja sprawdza ścieżkę, która jest teraz dostępna jako http: // server / svn / project / file i pobiera ten plik tak, jak był w wersji 1234. (Więc ta składnia nie działa po usunięciu pliku).
Druga składnia pobiera plik, który był dostępny jako http: // server / svn / project / file w wersji 1234. Zatem ta składnia DZIAŁA na usuniętych plikach.
Możesz nawet połączyć te metody, aby pobrać plik, który był dostępny w wersji 2345 jako http: // server / svn / project / file, ale z zawartością taką jak w 1234 z:
źródło
./local/file
gdy./local
katalog nie istniał. Może to nie stanowić problemu w nowszych wersjach SVN.^
notacja jest przydatna: odnosi się do katalogu głównego repozytorium, więc możesz powiedziećsvn cat ^/local/file@REV
(w zależności od odległości między katalogiem głównym repozytorium a adresem URL).svn: E200009: Could not cat all targets because some targets are directories
Najpierw znajdź numer wersji, w której plik został usunięty:
Następnie poszukaj w log.txt (nie guru SVN, więc nie znam lepszego sposobu), aby znaleźć wiersz z rozszerzeniem
i zobacz, która to była wersja. Następnie, podobnie jak w przypadku innych odpowiedzi, wskrzesz plik przy użyciu poprzedniej wersji.
źródło
W git to nic szczególnego. Jeśli znasz nazwę pliku, możesz sprawdzić zmianę, która go usunęła, w dzienniku:
Następnie możesz użyć tego zatwierdzenia, aby uzyskać plik w takiej postaci, w jakiej istniał przed usunięciem.
Przykład:
Należy zauważyć, że w rzeczywistości nie powoduje to przywrócenia pliku do kontroli wersji. Po prostu upuszcza plik, który istniał w swoim ostatecznym stanie, do bieżącej lokalizacji. Następnie możesz go dodać lub po prostu sprawdzić lub cokolwiek od tego momentu.
źródło
Rozwiązanie wykorzystujące tylko GUI:
Jeśli znasz nazwę pliku, ale nie znasz jego numeru ostatniej wersji ani nawet ścieżki:
Spowoduje to wyświetlenie tylko tych wersji, w których plik został dodany / zmodyfikowany / usunięty. To jest twoja historia pliku.
Zwróć uwagę, że jeśli plik został usunięty przez usunięcie jednego z jego folderów nadrzędnych, nie będzie miał wpisu „usunięty” w dzienniku (więc rozwiązanie mjy nie będzie działać). W takim przypadku jego najnowszy wpis w przefiltrowanym dzienniku będzie odpowiadał jego zawartości w momencie usunięcia.
źródło
Zapewni ci ścieżkę i rewizję. W git (sprawdza również zmianę nazw):
źródło
Oprócz odpowiedzi Dustina, jeśli chcesz tylko przejrzeć zawartość, a nie to sprawdzić, w jego przykładzie możesz zrobić:
the: oddziela wersję i ścieżkę w tej wersji, efektywnie prosząc o określoną ścieżkę przy określonej wersji.
źródło
Użyj tego polecenia:
Spowoduje to wyświetlenie wszystkich wersji, które kiedykolwiek usunęły pliki pasujące do wzorca. Oznacza to, że jeśli szukasz pliku README, a następnie wszystko
/src/README
,/src/README.first
i/some/deeply/hidden/directory/READMENOT
będzie można znaleźć i liście.Jeśli nazwa pliku zawiera ukośniki (ścieżkę), kropki lub inne specjalne znaki wyrażenia regularnego, nie zapomnij ich zmienić, aby uniknąć niezgodności lub błędów.
źródło
Jeśli nie znasz ścieżki do usuniętego pliku, okazuje się, że możesz go wyszukać za pomocą zbyt ciężkiego
svn log
polecenia:Polecenie prawdopodobnie wbija serwer tak samo jak bez opcji wyszukiwania, ale przynajmniej reszta zaangażowanych zasobów (w tym gałki oczne) byłaby trochę odciążona, ponieważ powie ci, w której wersji ten plik został usunięty. Następnie możesz postępować zgodnie z innymi wskazówkami (głównie za pomocą tego samego
svn log
polecenia, ale już na zdefiniowanej ścieżce).źródło
svn log --search _test2.php -v
... svn: invalid option: --search ... :(Plakat faktycznie zadał tutaj 3 pytania:
Wszystkie odpowiedzi, które tu widzę, dotyczą pytań 2 i 3.
Odpowiedź na pytanie 1 brzmi:
Nadal musisz uzyskać numer wersji, kiedy plik istniał ostatnio, na co inni wyraźnie udzielają odpowiedzi.
źródło
Ach, odkąd uczę się używać Bazaar, próbowałem. Bez powodzenia wygląda na to, że nie możesz obecnie rejestrować i dodawać adnotacji do usuniętych plików ... :-(
Wypróbowany:
ale ciekawie (i na szczęście) umiem:
i:
i jak zasugerowano w powyższym błędzie:
(ustaw parametr
-B
(--before-context
) w razie potrzeby).źródło
Trzeba by określić wersję.
źródło
Jeśli chcesz przejrzeć historię pliku przed zmianą jego nazwy, to jak wspomniano w komentarzu , możesz użyć
źródło
Sam chciałem odpowiedzi. Spróbuj wykonać następujące czynności, aby wyprowadzić tylko usunięcia z
svn log
.To filtruje dane wyjściowe dziennika przez awk . awk buforuje każdy znaleziony wiersz rewizji, wyprowadzając go tylko wtedy, gdy zostanie znaleziony rekord usunięcia. Każda rewizja jest wyprowadzana tylko raz, więc wielokrotne usunięcia w jednej rewizji są grupowane (tak jak w przypadku standardowego
svn log
wyjścia).Możesz określić,
--limit
aby zmniejszyć liczbę zwracanych rekordów. W--stop-on-copy
razie potrzeby możesz również usunąć plik.Wiem, że pojawiają się skargi dotyczące wydajności analizowania całego dziennika. Myślę, że jest to lepsze rozwiązanie niż grep i jego
-B
opcja „rzucić szeroką sieć” . Nie wiem, czy jest bardziej wydajna, ale nie mogę wymyślić alternatywysvn log
. Jest podobny do odpowiedzi @Alexander Amelkin, ale nie wymaga konkretnej nazwy. To także mój pierwszy skrypt awk , więc może być niekonwencjonalny.źródło
Załóżmy, że twój plik został nazwany ~ / src / a / b / c / deleted.file
przykładowe dane wyjściowe, znaleziono je pod adresem r90440
skopiuj go z powrotem do poprzedniej wersji (90439 = 90440-1)
źródło
Możesz znaleźć ostatnią wersję, która udostępnia plik, używając wyszukiwania binarnego. Stworzyłem do tego prosty
/bin/bash
skrypt:źródło
Napisałem skrypt php, który kopiuje dziennik svn wszystkich moich repozytoriów do bazy danych mysql. Mogę teraz wyszukiwać pełnotekstowe komentarze lub nazwy plików.
źródło