git fügt nur geänderte Änderungen hinzu und ignoriert nicht verfolgte Dateien

658

Ich habe "git status" ausgeführt und unten sind einige Dateien aufgeführt, die geändert wurden / oder unter der Überschrift "Änderungen, die nicht für das Festschreiben bereitgestellt wurden". Es wurden auch einige nicht verfolgte Dateien aufgelistet, die ich ignorieren möchte (ich habe eine ".gitignore" -Datei in diesen Verzeichnissen).

Ich möchte die geänderten Dateien in Staging stellen, damit ich sie festschreiben kann. Wenn ich "git add." Ausführte, wurden die geänderten Dateien UND die Dateien, die ich ignorieren möchte, zum Staging hinzugefügt.

Wie füge ich nur die geänderten Dateien hinzu und ignoriere die nicht verfolgten Dateien, wenn der Git-Status unten angezeigt wird.

Funktionieren meine ".gitignore" -Dateien auch ordnungsgemäß?

$ git status
# On branch addLocation
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   someProject/path/domain/viewer/LocationDO.java
#       modified:   someProject/path/service/ld/LdService.java
#       modified:   someProject/path/service/ld/LdServiceImpl.java
#       modified:   someProject/path/web/jsf/viewer/LocationFormAction.java
#       modified:   someProject/war/WEB-INF/classes/message/viewer/viewer.properties
#       modified:   someProject/war/page/viewer/searchForm.xhtml
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       .metadata/
#       someProject/build/
no changes added to commit (use "git add" and/or "git commit -a")
Steve
quelle
1
Wenn Sie die Gitignore-Datei hinzugefügt haben, nachdem Sie Dateien verfolgt haben, ignoriert die Gitignore-Datei keine Dateien, die bereits verfolgt werden. das könnte ein Problem sein.
BKSpurgeon

Antworten:

903

Idealerweise .gitignoresollten Sie verhindern, dass nicht verfolgte (und ignorierte) Dateien im Status angezeigt, mit git addusw. hinzugefügt werden . Daher möchte ich Sie bitten, Ihre zu korrigieren.gitignore

Sie können dies git add -utun, damit die geänderten und gelöschten Dateien bereitgestellt werden.

Sie können auch git commit -anur die geänderten und gelöschten Dateien festschreiben.

Beachten Sie, dass Sie Git der Version vor 2.0 verwenden git add .müssen git add -u .(siehe " Unterschied von" git add -A"und git add ." ").

Manojlds
quelle
74
Point of Interest, this ( add -u) fügt nicht nur modified Dateien hinzu, sondern "fügt" auch Dateien hinzu. Dies deletedversuche ich derzeit zu verhindern.
Zach Lysobey
6
Um nur geänderte Dateien hinzuzufügen, gehe ich normalerweise in das oberste Verzeichnis meines Repos und tippe for fil in $(git diff --name-only --relative); do git add $fil; done. Wenn ich es häufig verwenden würde (ich nicht), würde ich einfach einen Alias ​​dafür in meiner ~/.bashrcDatei erstellen. Dies funktioniert natürlich nur in Bash.
Krøllebølle
8
Keine eindeutige Antwort, nur "funktioniert für die meisten Menschen" Antworten? Muss ich einen anderen Prozess verwenden, um dies richtig zu machen? Wie ist das nicht in git add eingebaut? Es scheint so üblich zu sein, etwas tun zu wollen.
Samuel
2
nb Die in diesen Kommentaren genannten Methoden schlagen fehl, wenn Sie ungerade Dateinamen haben (Leerzeichen, Sternchen, was nicht). Verwenden Sie:IFS=$(echo -en "\n\b"); for file in $(git diff --name-only); do git add "$file"; done
Orwellophile
3
git add -uist kurz für git add --updateund git commit -aist kurz fürgit commit --all
Hugo
95

Das hat bei mir funktioniert:

#!/bin/bash

git add `git status | grep modified | sed 's/\(.*modified:\s*\)//'`

Oder noch besser:

$ git ls-files --modified | xargs git add
user877329
quelle
Sie brauchen keine Gruppierung (()), wenn Sie die Gruppe nicht wiederverwenden möchten, und lassen für mich ein Leerzeichen vor dem Dateinamen. Nicht, dass dies das Endergebnis in diesem Fall beeinflusst, aber um ein Beispiel zu setzen, hier der Befehl sed, den ich verwendet habe: sed 's /.* geändert: * //'. Verifiziert unter Mac OS X 10.9.5.
Samuel
@ Samuel Grouping ist nett, wenn Sie den Ausdruck testen. Dann kann ich das Streichholz in eckige Klammern drucken, um zu sehen, ob ich Recht habe.
user877329
1
@ Ярослав Ihre Lösung fügt geänderte und nicht verfolgte Dateien hinzu und ist gleich git add -u, sodass die Frage nicht beantwortet wird.
Nick Volynkin
7
--modified scheint sowohl gelöschte als auch gerade geänderte zu enthalten
DMart
2
git diff-files -z --diff-filter = M --name-only | xargs -0 git add --dry-run scheint gut zu funktionieren.
DMart
10
git commit -a -m "message"

-a: Schließt alle aktuell geänderten / gelöschten Dateien in dieses Commit ein. Beachten Sie jedoch, dass nicht verfolgte (neue) Dateien nicht enthalten sind.

-m: Legt die Nachricht des Commits fest

Saurabh
quelle
4

Sie haben nicht gesagt, was aktuell Ihr ist .gitignore, aber ein .gitignoremit den folgenden Inhalten in Ihrem Stammverzeichnis sollte den Trick tun.

.metadata
build
Karl Bielefeldt
quelle
3
Ich habe meinen .gitignore falsch benutzt. Ich hatte eine leere Gitignore-Datei in jedem Verzeichnis, das ich ignorieren wollte, anstatt einen einzigen Gitignore mit Inhalten darin zu haben.
Steve
1
@Steve: Das würde funktionieren, wenn jeder. gitognoreenthielt einen Start (alles ignorieren). Aber eine Single .gitignoreim obersten Verzeichnis ist normalerweise viel einfacher zu verwenden und reicht aus.
Maaartinus
2

Ich habe es zufällig versucht, damit ich zuerst die Liste der Dateien sehen konnte:

git status | grep "modified:" | awk '{print "git add  " $2}' > file.sh

cat ./file.sh

ausführen:

chmod a+x file.sh
./file.sh 

Bearbeiten: (siehe Kommentare) Dies könnte in einem Schritt erreicht werden:

git status | grep "modified:" | awk '{print $2}' | xargs git add && git status
Mike Q.
quelle
1
Dies könnte in einem Schritt erreicht werden:git status | grep modified | awk '{print $2}' | xargs git add && git status
Choylton B. Higginbottom
Ja, ich hätte diese Lösung auch bereitstellen sollen, danke, ich habe den Beitrag aktualisiert.
Mike Q
1

Ich bin mir nicht sicher, ob dies eine Funktion oder ein Fehler ist, aber das hat bei uns funktioniert:

git commit '' -m "Message"

Beachten Sie die leere Dateiliste ''. Git interpretiert dies so, dass alle geänderten nachverfolgten Dateien festgeschrieben werden, auch wenn sie nicht bereitgestellt werden, und nicht nachverfolgte Dateien ignoriert werden.

Erik Englund
quelle
Dies funktioniert definitiv nicht , wenn Sie --amend verwenden.
GhostCat
0

Geänderte und gelöschte Dateien bereitstellen

git add -u

Dayamoy
quelle