Chcę tylko uzyskać listę zmienionych plików między dwiema wersjami, co jest proste:
git diff -–name-only commit1 commit2 > /path/to/my/file
Ale co mam napisać, jeśli chcę skopiować wszystkie wymienione pliki w inne miejsce? I potrzebuję całkowicie identycznej struktury katalogów dla kopiowanych plików.
Na przykład zmodyfikowałem i dodałem pliki:
/protected/texts/file1.txt
/protected/scripts/index.php
/public/pics/pic1.png
Chcę mieć w /home/changes/
tych wszystkich zmienionych i dodanych plikach:
/home/changes/protected/texts/file1.txt
/home/changes/protected/scripts/index.php
/home/changes/public/pics/pic1.png
git format-patch
może to zrobić dla zakresów zatwierdzeń.git diff commit1 commit2 > my.patch
a potemcd other/path; patch -p1 < my.patch
. Dlaczego trzeba to robić z pełnymi kopiami plików? Jeśli to dlatego, że myślisz, że łatka może nie mieć zastosowania, a tym samym inny katalog nie jest wcommit1
stanie, naprawdę powinieneś skopiować wszystko zecommit2
stanu ...Odpowiedzi:
Wypróbuj następujące polecenie, które przetestowałem:
źródło
cp --parents
podpowiedź, chciałem tej opcji od lat i nigdy nie wiedziałem, że istnieje! .. oczywiście nigdy nie zawracałem sobie głowy szukaniem tego = \--parents
opcjacp
nie jest dostępna.IFS=$'\n'
pierwsze może to zrobić. (Najlepiej w podpowłoce, aby nie zepsuć oryginalnej wartości IFS.)cp: cannot stat 'git diff --name-only': No such file or directory
podczas git bash w systemie Windows. Co ja robię źle? Katalog docelowy istniejePoniższe powinny działać dobrze:
Aby wyjaśnić dalej:
To
-z
withgit diff --name-only
oznacza wyświetlenie listy plików oddzielonych bajtami NUL zamiast znakami nowej linii, na wypadek gdyby nazwy plików miały w sobie nietypowe znaki.-0
Sięxargs
mówi interpretować jako standardowe wejście liście NUL oddzielonych parametrów.Jest
-IREPLACE
to potrzebne, ponieważ domyślniexargs
dodaje parametry na końcursync
polecenia. Zamiast tego mówi się, aby umieścić je tam, gdzieREPLACE
jest później . (To miła wskazówka z odpowiedzi na błąd serwera ).-a
Parametr dorsync
środków w celu zachowania uprawnień, własności, itp jeśli to możliwe. Sposób-R
użycia pełnej ścieżki względnej podczas tworzenia plików w miejscu docelowym.Aktualizacja: jeśli masz starą wersję
xargs
, musisz użyć tej-i
opcji zamiast-I
. (Pierwsza jest przestarzała w nowszych wersjachfindutils
.)źródło
xargs --version
mówi?-i
zamiast tego, co jest przestarzałe w późniejszych wersjach - 4.1 jest teraz dość stary. Zaktualizuję odpowiedź.-I
w niektórych wersjach potrzebujesz spacji , więc może spróbuj-I REPLACE
zamiast tego.-I
jest obsługiwany tylko odfindutils
4.2.10, wydanego w grudniu 2004.--diff-filter=d
aby wykluczyć usunięte pliki z listy. W przeciwnym razie wystąpią błędy podczas próby skopiowania ich do folderu zmian. W przeciwnym razie świetna odpowiedź. Dzięki!Oto jedna linijka:
Wyświetl zmienione pliki i spakuj je jako * .zip:
Wyświetl ostatnio zatwierdzone zmienione pliki i spakuj je jako * .zip:
źródło
sed.exe
? Nadalzip
nie jestem wykrywany w systemie Windows.PATH
zmiennej env.źródło
https://stackoverflow.com/users/79061/sebastian-paaske-t%c3%b8rholm
źródło
Działa doskonale.
źródło
Nikt nie wspomniał o tym,
cpio
który jest łatwy do wpisania, tworzy twarde linki i obsługuje spacje w nazwach plików:źródło