2012-04-04 13 views
17

W git, czy istnieje jakiś (prosty) sposób modyfikowania indeksu, aby dodawać tylko zmiany w plikach już w nim zawartych? Brzmi to trochę skomplikowanie, ale to, co chcę osiągnąć, jest proste.Odświeżanie plików etapowych

Powiedzmy mój indeks wygląda tak (lekko pozbawiony git status wyjście):

# Changes to be committed: 
#  modified: A 
#  modified: B 
# 
# Changed but not updated: 
#  modified: B 
#  modified: C 
# 
# Untracked files: 
#  D 

Niektóre zmiany B są w indeksie, niektóre nie. C nie jest w ogóle wystawiany.

Jak mogę zaktualizować B w indeksie (etap jego zmiany nieopublikowane) bez dodawania C?

tj. Chciałbym na indeks wyglądać tak:

# Changes to be committed: 
#  modified: A 
#  modified: B 
# 
# Changed but not updated: 
#  modified: C 
# 
# Untracked files: 
#  D 

W tym prostym przypadku może oczywiście zostać osiągnięty za pomocą prostego git add B, ale chciałbym wiedzieć, czy istnieje prosta odpowiedź na ogólnym przypadku. Próbowałem git add --refresh, ale jeśli dobrze rozumiem, to tylko aktualizuje informacje o statystykach.

+0

można pokazać prawdziwy przypadek użycia, w którym chcesz to zrobić? Nie mogę sobie wyobrazić żadnego (dodawanie pliku i modyfikowanie go nie oznacza automatycznie, że będę chciał dodać te zmiany, szczególnie gdy nie chcę dodawać zmian w innych plikach). –

+0

@JanHudec Prawdopodobnie nie potrzebowałbym tego, gdybym był bardziej rygorystyczny i dotknął tylko tych plików, które powinny wejść w zatwierdzenie ('B'). Czasami jednak jestem zawiedziony i zaczynam wprowadzać zmiany, które powinny być w nowym zatwierdzeniu ('C'), więc dodaję" B "do indeksu. Przed dokonaniem zatwierdzenia zawsze sprawdzam diff --cached, a czasami czyściłem coś w 'B'. i wtedy potrzebuję tego. Myślę, że prawdopodobnie można by to rozwiązać w inny sposób, powiedzmy ze stash – axelarge

+0

Chodzi mi o to, że kiedy robisz coś w pliku 'X', które powinno iść w zatwierdzeniu' B' i daj się ponieść emocjom i wykonaj zmiany, które powinny przejść w zatwierdzeniu 'C', niektóre z tych zmian są często ponownie do pliku' X'. W takim przypadku należy ręcznie dodać -i indywidualne porcje, a nie tylko ponownie dodać plik 'X'. Oczywiście, jeśli zostaniesz zawiedziony, prawdopodobnie zauważyłeś coś wokół tego, co zmieniłeś, dlatego jest mało prawdopodobne, że dodatkowe zmiany nie dotkną plików, które zestaw pięści robi. –

Odpowiedz

22

Następujące polecenie zaktualizuje indeks zawierać inne zmiany w B, które nie zostały jeszcze zainscenizowane:

git update-index --again 
+1

Ah, o wiele lepiej niż moja metoda! – torek

+0

Idealny! Dokładnie tego potrzebowałem – axelarge

1

nie wiem od zupełnie trywialny sposób to zrobić, ale:

git status --porcelain 

pokaże plik B (i tylko b) jako państwowego "MM", a więc:

git status --porcelain | grep ^MM | cut -d' ' -f 2 

wyświetli listę takich plików.

Nie ma nic złego w "ponownym dodawaniu".

Można również użyć git diff-index --cached --name-status HEAD. (Może to potrzebne, jeśli git jest zbyt stary, by mieć git status --porcelain.)

+0

Dzięki, nie wiedziałem o --porcelain dla statusu. – axelarge

+0

Jest to obecnie takie samo jak -s/--short, ale obiecuje, że nadal będzie zdolne do przetwarzania maszynowego, co jest ważne, jeśli umieścisz je w jakimś skrypcie. :-) – torek

+0

Próbowałem 'git status --porcelain | grep^[AM] M | cut -d '' -f 2- | xargs git add', ale kończy się niepowodzeniem z nazwami plików, które zawierają spacje.Sądzę, że może to być postrzegane jako kolejne pytanie, ale może możesz pomóc? Z xargs -0 to nie działa wcale – axelarge

Powiązane problemy