W jaki sposób svn mogę dodać wszystkie niewersjonowane pliki do SVN?


177

Szukam dobrego sposobu, aby automatycznie „svn dodać” wszystkie niewersjonowane pliki w kopii roboczej do mojego repozytorium SVN.

Mam serwer na żywo, który może utworzyć kilka plików, które powinny być pod kontrolą źródła. Chciałbym mieć krótki skrypt, który mogę uruchomić, aby automatycznie je dodać, zamiast przeglądać i dodawać je pojedynczo.

Na moim serwerze działa system Windows Server 2003, więc rozwiązanie uniksowe nie będzie działać.


1
@Saul To pytanie wyraźnie poprzedza to, które podłączyłeś, więc nie rozumiem, jak może być duplikatem. Jeśli cokolwiek, drugim pytaniem jest duplikat.
Neutrino

Cygwin jest opcją. Daje moc bash w dowolnym środowisku Windows. Od ponad 10 lat jestem użytkownikiem z bardzo małymi problemami.
user151841,

Odpowiedzi:


346

svn add --force * --auto-props --parents --depth infinity -q

Świetna wskazówka! Jedna uwaga: mój Eclipse automatycznie dodaje nowe pliki do listy ignorowanych. Może to być kwestia konfiguracji, ale tak czy inaczej: istnieje --no-ignoreopcja, która pomaga.

Następnie możesz zatwierdzić:

svn commit -m 'Adding a file'

14
Świetna wskazówka. Znacznie lepiej niż przy użyciu statusu svn. „svn add --force” wydaje się wystarczające.
Imię

1
Czy istnieje prosty sposób, aby ustawić to na skrócone makro (tj. Tak jak w przypadku git)? Czy byłoby również możliwe zaktualizowanie tej odpowiedzi, tak aby wyjaśniała każdy bit?
MrDuk

2
@ MrDuk: Skrócone: alias magic="svn add --force * --auto-props --parents --depth infinity -q"- Wyjaśnione:svn help add
Ronan

17
Problem polega na tym, czy to dodaje poprawnie ignorowane pliki? Nie pożądane.
ladieu

1
@Name - musisz umieścić *na końcu, bo inaczej by to nie zadziałało (na wynajem dla mnie)
vsync

72

To jest inne pytanie niż moje, ale odpowiedź na to pytanie brzmi:

svn status | grep '?' | sed 's/^.* /svn add /' | bash

8
Korzysta z narzędzi UNIX (grep, sed, bash), których według OP nie ma.
Naaff

3
także prawdopodobnie mógłbyś wykopać sed i grep w oknach, jeśli naprawdę tego chciałeś.
Sam Saffron,

1
Przepraszam za tę opinię na temat komentarza cygwina, nie była zamierzona (i nie mogę tego cofnąć). W rzeczywistości uważam, że cygwin jest tak brzydki, jak to tylko możliwe w systemie Windows. Nadal możesz używać findstr zamiast grep, który będzie działał przynajmniej od Windows 2000 bez instalowania żadnych dodatkowych elementów.
Joey,

@Johannes właśnie dla ciebie meta.stackexchange.com/questions/1775/…
Sam Saffron

2
Jestem z mbyrne215; ta odpowiedź pomogła mi bardziej niż rozwiązanie PO, więc głosuję. Działa idealnie w OS X 10.6.7.
Asbjørn Ulsberg

37

Co to działa:

c:\work\repo1>svn add . --force

Dodaje zawartość podkatalogów.

Nie dodaje ignorowanych plików.

Wyświetla listę plików, które zostały dodane.

Kropka w poleceniu wskazuje bieżący katalog, który można zastąpić określoną nazwą katalogu lub ścieżką, jeśli chcesz dodać katalog inny niż bieżący.


Właściwie to powinno być .\*lub jeśli katalog główny svn znajduje się w innym katalogu stuff\svn_root\*.
Nux

Nie podążam. Polecenia do SVN są wykonywane w kontekście ścieżki, z której są wykonywane, należy się tego spodziewać. Samo „svn add. \ *” nie powtarza się i drukuje masę spamu ostrzegawczego, uniemożliwiając zobaczenie, co faktycznie zostało dodane. „svn add. \ * --force” powtarza się, ale także wypisuje „svn: Pomijanie argumentu: E200025: '. \. svn' kończy się nazwą zastrzeżoną”. To wydaje się gorsze niż moje oryginalne rozwiązanie.
Neutrino

Wskazałem, że prawdopodobnie nie masz całego dysku C na SVN ;-), więc powinieneś dodać ścieżkę. I z mojej ścieżki specyfikacji, ponieważ stuff\svn_rootnie dodaje plików do podkatalogów (np. W stuff\svn_root\already_in_svn\not_in_svn.txt). Stąd gwiazda na końcu.
Nux

@Nux Dopiero teraz po tylu latach wreszcie widzę, o co ci chodziło :) W poleceniu kropka jest ścieżką określającą bieżący katalog. Oczywiście zamiast tego można podać dowolną ważną alternatywę.
Neutrino,

To jest właściwa odpowiedź. Nie jestem pewien, w jaki sposób rozwiązanie obejmujące dodawanie ignorowanych plików ma najwyższą pozycję. @Neutrino, zasugeruj usunięcie komentarza do joeya, który już nie pojawia się na tej stronie, a także dodaj wiersz potwierdzający, że twoja sugestia NIE dodaje ignorowanych plików
b_levitt

35

To działało dla mnie:

svn add `svn status . | grep "^?" | awk '{print $2}'`

( Źródło )

Ponieważ rozwiązałeś już problem z Windows, jest to rozwiązanie UNIX (po Samie). Dodałem tutaj, ponieważ uważam, że nadal jest przydatny dla tych, którzy odpowiedzą na to pytanie, prosząc o to samo (ponieważ tytuł nie zawiera słowa kluczowego „WINDOWS”).

Uwaga (luty 2015): Jak skomentował „bdrx”, powyższe polecenie można dodatkowo uprościć w następujący sposób:

 svn add `svn status . | awk '/^[?]/{print $2}'`

1
Ładne, zwarte, zwięzłe, nadaje się również do rozbudowy. Dzięki.
Norman H

1
Wspaniały. Również łatwe do rozszerzenia, modyfikacji, aby usunąć itp.
Drewid

Idealny do tego, czego potrzebowałem. Dziękuję Ci!
Jeff

2
Dlaczego ludzie zawsze grepują, a potem piszczą, by się obudzić? Awk może zrobić dopasowanie wzoru: awk '/^[?]/{print $2}'; Nie ma potrzeby dodatkowego procesu grep.
bdrx

1
@bdrx: Być może dlatego, że grep jest często kojarzony z dopasowaniem wzorca? W moim osobistym przypadku jestem znacznie bardziej doświadczony z grep niż z awk. Nie wiedziałem, że możesz robić takie rzeczy w awk, więc zacznę używać awk więcej w moich skryptach. Dzięki!
lepe

5
svn add --force .

Spowoduje to dodanie dowolnego niewersjonowanego pliku do bieżącego katalogu i wszystkich wersjonowanych katalogów podrzędnych.


5

Ta metoda powinna obsługiwać nazwy plików, które zawierają dowolną liczbę / kombinację spacji ...

svn status /home/websites/website1 | grep -Z "^?" | sed s/^?// | sed s/[[:space:]]*// | xargs -i svn add \"{}\"

Oto wyjaśnienie działania tego polecenia:

  • Wyświetl wszystkie zmienione pliki.
  • Ogranicz tę listę do linii za pomocą „?” na początku - tj. nowe pliki.
  • Usunąć '?' znak na początku wiersza.
  • Usuń spacje na początku linii.
  • Wklej nazwy plików do xargs, aby uruchomić dodawanie svn wiele razy.

Użyj argumentu -i do xargs, aby poradzić sobie z możliwością importowania nazw plików ze spacjami do 'svn add' - w zasadzie -i ustawia {} do użycia jako symbol zastępczy, abyśmy mogli umieścić znaki "wokół nazwy pliku używanej przez 'svn Dodaj'.

Zaletą tej metody jest to, że powinna ona obsługiwać nazwy plików ze spacjami.


Zakłada się, że Linux lub podobny (np. MinGW lub Cygwin ). OP stwierdził: „Na moim serwerze działa system Windows Server 2003, więc rozwiązanie uniksowe nie będzie działać”.
Peter Mortensen

4

TortoiseSVN ma tę funkcję wbudowaną, jeśli chcesz użyć rozwiązania innego niż wiersz poleceń. Kliknij prawym przyciskiem myszy folder najwyższego poziomu i wybierz Dodaj ...


Z ogromnym repozytorium TortoiseSVN zawiesza się. To sprawiło, że zacząłem szukać alternatywnych linii poleceń :-)
Upendra


3

Posługiwać się:

svn st | grep ? | cut -d? -f2 | xargs svn add

1
Lub możesz użyć cut do wykonania zadania grep: svn status | cut -d ? -f 2 -s | xargs svn add
Eric3

Zakłada się, że Linux lub podobny (np. MinGW lub Cygwin ). OP stwierdził: „Na moim serwerze działa system Windows Server 2003, więc rozwiązanie uniksowe nie będzie działać”.
Peter Mortensen

3

Zawsze używam:

Kopiuj wklej

svn st | grep "^\?" | awk "{print \$2}" | xargs svn add $1

1
Op explicity stwierdza, że ​​rozwiązanie uniksowe jest dla niego bezużyteczne.
Neutrino

Zakłada się, że Linux lub podobny (np. MinGW lub Cygwin ). OP stwierdził: „Na moim serwerze działa system Windows Server 2003, więc rozwiązanie uniksowe nie będzie działać”.
Peter Mortensen

3

Ponieważ ten post jest oznaczony jako Windows, pomyślałem, że opracuję rozwiązanie dla systemu Windows. Chciałem zautomatyzować ten proces i utworzyłem plik nietoperza. Opierałem się tworzeniu pliku console.exe w języku C #.

Chciałem dodać pliki lub foldery, które nie są dodawane do mojego repozytorium, kiedy rozpoczynam proces zatwierdzania.

Problem z wieloma odpowiedziami polega na tym, że będą wyświetlać niewersjonowane pliki, które należy zignorować zgodnie z moją listą ignorowania w TortoiseSVN .

Oto moje ustawienie haka i plik wsadowy, który to robi

Skrypt haka żółwia:

"start_commit_hook".
(where I checkout) working copy path = C:\Projects
command line: C:\windows\system32\cmd.exe /c C:\Tools\SVN\svnadd.bat
(X) Wait for the script to finish
(X) (Optional) Hide script while running
(X) Always execute the script

svnadd.bat

@echo off

rem Iterates each line result from the command which lists files/folders
rem     not added to source control while respecting the ignore list.
FOR /F "delims==" %%G IN ('svn status ^| findstr "^?"') DO call :DoSVNAdd "%%G"
goto end

:DoSVNAdd
set addPath=%1
rem Remove line prefix formatting from svn status command output as well as
rem    quotes from the G call (as required for long folder names). Then
rem    place quotes back around the path for the SVN add call.
set addPath="%addPath:~9,-1%"
svn add %addPath%

:end

2
for /f "usebackq tokens=2*" %%i in (`svn status ^| findstr /r "^\?"`) do svn add "%%i %%j"

W ramach tej implementacji będziesz mieć kłopoty, jeśli twoje foldery / nazwy plików mają więcej niż jedno miejsce, jak poniżej:

"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\Sega Mega      2"
"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\One space"
"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\Double  space"
"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\Single"

takie przypadki są objęte prostymi:

for /f "usebackq tokens=1*" %%i in (`svn status ^| findstr /r "^\?"`) do svn add "%%j"

2

Jeśli korzystasz z systemu Linux lub Cygwin lub MinGW w systemie Windows, możesz użyć rozwiązań typu bash, takich jak poniżej. W przeciwieństwie do innych podobnych tutaj przedstawionych, ten uwzględnia przestrzenie nazw plików:

svn status| grep ^? | while read line ; do  svn add "`echo $line|cut --complement -c 1,2`" ;done

Po co to? CMD? Grzmotnąć? Wygląda jak Bash (lub podobna powłoka). W takim przypadku zakłada Linux lub podobny (np. MinGW lub Cygwin ). OP stwierdził: „Na moim serwerze działa system Windows Server 2003, więc rozwiązanie uniksowe nie będzie działać”.
Peter Mortensen

Dzięki, masz rację, kiedy jestem w systemie Windows, używam Cygwin z Bash. Jednak stwierdzenie „Na moim serwerze działa system Windows Server 2003, więc rozwiązanie uniksowe nie będzie działać”. to fałsz. Może nie chce używać Cygwina lub MinGW, ale nie wyraził się w ten sposób. Przeformułowałem odpowiedź.
ajaest

1

Po spędzeniu czasu na zastanawianiu się, jak rekurencyjnie dodawać tylko niektóre pliki, pomyślałem, że warto udostępnić to, co zadziałało:

FOR /F %F IN ('dir /s /b /a:d') DO svn add --depth=empty "%F"
FOR /F %F IN ('dir /s /b /a *.cs *.csproj *.rpt *.xsd *.resx *.ico *.sql') DO svn add "%F"

Oto wyjaśnienie.

Pierwsze polecenie dodaje wszystkie katalogi. Drugie polecenie dodaje tylko pliki zgodnie z określonymi wzorami.

Pozwól, że podam więcej szczegółów:

  • ZA: wiesz, sterowanie pętlą.
  • / F: oznacza zabranie plików i katalogów (nie jestem pewien dokładnie).
  • % F: jest to zmienna; przyjmie wartość każdego z wymienionych plików na raz; może mieć inną jednoznakową nazwę.
  • IN: nie trzeba wyjaśniać, prawda?
  • ('dir / s / b / a: d'): polecenie DOS-a, które wyświetli katalogi; w moim przypadku / s jest rekurencyjny, / b przyjmuje tylko pełną ścieżkę, / a: d oznacza tylko katalog; zmień to, jak chcesz zachować nawias i apostrofy.
  • ZRÓB: oznacza, że ​​następne polecenie będzie wykonywane dla każdego katalogu
  • svn add --depth = empty: jest pożądanym komendą SVN do uruchomienia; definicja głębokości oznacza dodanie tylko katalogu, a nie plików w nim zawartych.
  • „% F”: w ten sposób korzystasz ze zdefiniowanej wcześniej zmiennej.

W drugim poleceniu jedynymi różnicami są polecenie dir i polecenie svn, myślę, że jest wystarczająco jasne.


0

Możesz użyć polecenia

svn add * force--

lub

svn add <directory/file name>

Jeśli Twoje pliki / katalogi nie są dodawane rekurencyjnie. Następnie sprawdź to.

Dodawanie rekurencyjne jest właściwością domyślną . Możesz zobaczyć w książce SVN .

Problem może znajdować się na liście ignorowanych lub we właściwościach globalnych.

Mam rozwiązanie Google do śledzenia problemów

Sprawdź właściwości globalne pod kątem ignorowania gwiazdki (*)

  • Kliknij okno repo prawym przyciskiem myszy. Wybierz TortoiseSVN > Properties.
  • Sprawdź, czy nie masz nieruchomości svn:global-ignores with a value of *
  • Jeśli masz właściwość, star(*)to zignoruje dodawanie rekurencyjne. Więc usuń tę właściwość.

Sprawdź globalny wzór ignorowania dla ignorowania gwiazdy (*)

  • Kliknij okno repo prawym przyciskiem myszy. Wybierz TortoiseSVN > Settings > General.
  • Zobacz w Global Ignore Pattern, jeśli nie ustawiłeś tam gwiazdki (*) .
  • Jeśli znalazłeś star(*), usuń tę właściwość.

Ten facet też wyjaśnił dlaczego ta właściwość została dodana w moim projekcie.

Najbardziej podobnym sposobem jest to, że ktoś kliknął plik prawym przyciskiem myszy bez rozszerzenia i wybrał TortoiseSVN -> SVN Ignoruj ​​-> * (rekurencyjnie), a następnie dokonał tego.

Możesz sprawdzić dziennik, aby zobaczyć, kto dokonał zmiany właściwości, dowiedzieć się, co faktycznie próbowali zrobić, i poprosić ich o większą ostrożność w przyszłości. :)


0

W systemie Linux możesz wprowadzić następujące polecenie:

find ./ -name "*." | xargs svn add

0

Ponieważ określił system Windows, w którym awk i sed nie są standardowe:

for /f "tokens=1*" %e in ('svn status^|findstr "^\?"') do svn add "%f"

lub w pliku wsadowym:

for /f "tokens=1*" %%e in ('svn status^|findstr "^\?"') do svn add "%%f"

0

Jest to leniwy i niebezpieczny sposób synchronizacji katalogu z SVN, w tym nowych plików:

svn rm --keep-local dir
svn add dir

Chociaż może to działać w skrócie, może mieć również poważne konsekwencje. Na przykład SVN często traci historię pliku.

Idealnym sposobem synchronizacji katalogu jest możliwość różnicowania, a następnie używania łatki svn, jednak różni się ona od formatów w poleceniu diff, a polecenie svn diff porównuje różnice w katalogu roboczym, a nie różnice na poziomie systemu plików.


-1

Myślę, że zrobiłem coś podobnego z:

svn add . --recursive

ale nie jestem pewien, czy moja pamięć jest poprawna ;-p


2
tylko aktualizacja pamięci: svn 1.4 i 1.5 nie obsługują - rekursywny jako parametr dla svn add :)
Ludwig Wensauer
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.