2009-11-05 17 views
8

Czy istnieje prosty sposób na eksportowanie/archiwizowanie tylko zmienionych plików z danego zatwierdzenia lub serii zatwierdzeń w git? Nie mogę znaleźć wyraźnych instrukcji, aby to zrobić (i jestem nowy w Linuksie/Git).Eksportowanie/archiwizowanie zmienionych plików tylko w Git

Używam programu msysgit i na ogół wdrażam całe repozytoria, ale w wielu przypadkach jest o wiele wydajniej wdrażać małe poprawki po kilka plików jednocześnie.

Pchanie/ciągnięcie/instalowanie gita na zdalnych serwerach nie jest tak naprawdę opcją, ponieważ mój poziom dostępu jest różny w zależności od projektu i klienta.

Czy istnieje prosta droga do (rough guess):

pipe 'diff --names-only' to 'git-archive'? 

Odpowiedz

25

Nie sądzę, nie ma żadnej potrzeby angażowania git-archiwum. Korzystanie --name-only, można tar zapasowej plików:

tar czf new-files.tar.gz `git diff --name-only [diff options]` 

Skoro jesteś nowy w Linuksie, to może trzeba jakieś wyjaśnienie:

The odwrócone, pojedyncze apostrofy w linii poleceń wywołać powłokę najpierw wykonać polecenie w ciągu backticks, a następnie zamień dane wyjściowe tego polecenia na wiersz poleceń tar. Najpierw uruchamiany jest git diff, który generuje listę nazw plików, po jednej w każdym wierszu. Nowe linie są zwinięte do spacji, a cała lista plików znajduje się na linii poleceń tar. Następnie zostanie uruchomione tar, aby utworzyć dane archiwum. Zauważ, że może to wygenerować dość długie wiersze poleceń, więc jeśli masz bardzo dużo zmienionych plików, możesz potrzebować innej techniki.

+4

Dla potomności ta odmienna technika mogłaby wyglądać następująco: 'git diff - only-only [diff options] | xargs tar -czf files.tar.gz' – jason

+2

Z 'xargs', masz inny problem, ponieważ' xargs' będzie uruchamiał 'tar' więcej niż raz, jeśli istnieje zbyt wiele plików, aby umieścić je wszystkie w jednym wierszu poleceń. Spowoduje to, że 'tar' utworzy nowy plik .tar, zastępując poprzedni, więc będzie zawierał tylko pliki ostatniej partii. –

+0

Dzięki za wyjaśnienie składni! Potrzebne są backticks :) Działa to doskonale w linii poleceń programu bash, które pochodzi z msysgit, z wyjątkiem sytuacji, gdy w nazwach plików są spacje (okna ...). Czy istnieje sposób, aby uciec z nich automatycznie? – AKS

Powiązane problemy