2012-04-04 8 views
17

Gibt es in Git eine (einfache) Möglichkeit, den Index zu ändern, so dass nur Änderungen an Dateien hinzugefügt werden, die bereits darin enthalten sind? Es klingt etwas kompliziert, aber was ich erreichen möchte, ist einfach.Staging-Dateien aktualisieren

Können sagen, mein Index sieht wie folgt aus (leicht git status Ausgang gestrippt):

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

Einige Änderungen an B im Index enthalten sind, sind einige nicht. C wird überhaupt nicht inszeniert.

Wie kann ich B im Index aktualisieren (nicht gestartete Änderungen durchführen), ohne C hinzuzufügen?

I.e. Ich möchte mich für den Index wie folgt aussehen:

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

In diesem einfachen Fall kann es natürlich mit einem einfachen git add B erreicht werden, aber ich würde gerne wissen, ob es eine einfache Antwort für den allgemeinen Fall ist. Ich versuchte git add --refresh, aber wenn ich richtig verstehe, aktualisiert das nur Statistikinformationen.

+0

Können Sie zeigen echter Anwendungsfall, wo du das machen willst? Ich kann mir das nicht vorstellen (wenn ich eine Datei hinzufüge und sie dann mehr modifiziere, heißt das nicht automatisch, dass ich auch diese Änderungen hinzufügen möchte, besonders wenn ich keine Änderungen in anderen Dateien hinzufügen möchte). –

+0

@ JanHudec Ich würde das wahrscheinlich nicht brauchen, wenn ich strenger wäre und nur die Dateien berührte, die in den Commit ('B') gehen sollten. Jedoch manchmal werde ich davongetragen und beginne Änderungen vorzunehmen, die in einem neuen Commit ('C') sein sollten, also füge ich' B' zum Index hinzu. Bevor ich etwas mache, schaue ich immer auf diff --cached und manchmal säubere ich etwas in 'B'. und das ist, wenn ich das brauche. Ich denke, es könnte wahrscheinlich auf andere Weise gelöst werden, sagen wir mit stash – axelarge

+0

Mein Punkt ist, dass, wenn Sie etwas in der Datei 'X' tun, das Commit' B' gehen sollte und sich fortbewegen und Änderungen, die in commit gehen sollten 'C', einige dieser Änderungen sind oft wieder zu' X' Datei. In diesem Fall möchten Sie manuell -i einzelne hunks hinzufügen und nicht nur die Datei 'X' erneut hinzufügen. Offensichtlich hast du wahrscheinlich etwas an dem Punkt bemerkt, an dem du dich verändert hast, weshalb es unwahrscheinlich ist, dass die zusätzlichen Änderungen die Dateien der ersten Gruppe berühren. –

Antwort

22

Der folgende Befehl den Index aktualisieren, um die anderen Änderungen in B enthalten, die bisher noch nicht inszeniert hat:

git update-index --again 
+1

Ah, viel besser als meine Methode! – torek

+0

Perfekt! Genau das habe ich gebraucht – axelarge

1

Ich weiß nicht, von einem ganz trivialen Weg, dies zu tun, aber:

git status --porcelain 

Datei B zeigen (und nur B) als Zustand "MM", so:

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

wird eine Liste solcher Dateien erzeugen.

Es ist nicht schaden in "neu hinzufügen" A, though.

Sie können auch git diff-index --cached --name-status HEAD verwenden. (Möglicherweise müssen Sie dies, wenn Ihr git zu alt ist git status --porcelain zu haben.)

+0

Danke, ich wusste nicht über --Porcelain für Status. – axelarge

+0

Es ist zur Zeit dasselbe wie -s/--short, aber es verspricht weiterhin maschinell zu parsen, was wichtig ist, wenn Sie es in ein Skript stecken. :-) – torek

+0

Ich habe 'git status --porcelain | versucht grep^[AM] M | Schnitt -d '' -f 2- | xargs git add', aber es schlägt mit Dateinamen fehl, die Leerzeichen enthalten.Ich denke, das könnte als eine andere Frage gesehen werden, aber vielleicht können Sie helfen? Mit xargs -0 funktioniert es gar nicht – axelarge