git dodaje tylko zmodyfikowane zmiany i ignoruje nieśledzone pliki


658

Uruchomiłem „git status”, a poniżej wymieniono niektóre pliki, które zostały zmodyfikowane / lub pod nagłówkiem „zmiany nie zostały wprowadzone do zatwierdzenia”. Zawiera także listę nieśledzonych plików, które chcę zignorować (w tych katalogach mam plik „.gitignore”).

Chcę umieścić zmodyfikowane pliki na etapie przemieszczania, aby móc je zatwierdzić. Kiedy uruchomiłem „git add.”, Dodało zmodyfikowane pliki ORAZ pliki, które chcę zignorować do inscenizacji.

Jak dodać tylko zmodyfikowane pliki i zignorować nieśledzone pliki, jeśli podano poniżej status git.

Czy moje pliki „.gitignore” działają poprawnie?

$ 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")

1
jeśli dodasz plik .gitignore PO Śledzeniu plików, wówczas plik .gitignore nie zignoruje plików, które są już śledzone. to może być problem.
BKSpurgeon

Odpowiedzi:


904

Idealnie .gitignorepowinieneś zapobiegać wyświetlaniu statusu nieśledzonych (i ignorowanych) plików, dodawaniu za pomocą git additp. Więc poprosiłbym cię o poprawienie.gitignore

Możesz to zrobić, git add -uaby wyrównać zmodyfikowane i usunięte pliki.

Możesz także zrobić, git commit -aaby zatwierdzić tylko zmodyfikowane i usunięte pliki.

Zauważ, że jeśli korzystasz z Gita w wersji wcześniejszej niż 2.0 i używasz go git add ., musisz go użyć git add -u .(patrz „ Różnica między git add -A” i „ git add . ”).


74
ciekawe, to ( add -u) nie dodaje tylko modified plików, ale także „dodaje” deletedte… coś , czemu obecnie próbuję zapobiec.
Zach Lysobey,

6
Aby dodać tylko zmodyfikowane pliki, zwykle przechodzę do góry w górnym katalogu mojego repo i piszę for fil in $(git diff --name-only --relative); do git add $fil; done. Gdybym miał go często używać (nie używam), po prostu zrobiłbym dla tego alias w moim ~/.bashrcpliku. To działa oczywiście tylko w bash.
Krøllebølle,

8
Brak jednoznacznej odpowiedzi, tylko odpowiedzi „dla większości ludzi”? Muszę użyć innego procesu, aby zrobić to poprawnie? Jak to nie jest wbudowane w git add? Wydaje się, że tak powszechną rzeczą jest robić.
Samuel

2
nb metody wymienione w tych komentarzach zawiodą, jeśli masz nieparzyste nazwy plików (spacje, gwiazdki, co nie). Aby poprawnie uciec od dziwnie nazwanych plików, użyj:IFS=$(echo -en "\n\b"); for file in $(git diff --name-only); do git add "$file"; done
Orwellophile

3
git add -ujest skrótem od git add --updatei git commit -aoznaczagit commit --all
Hugo

96

To działało dla mnie:

#!/bin/bash

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

Lub nawet lepiej:

$ git ls-files --modified | xargs git add

Nie potrzebujesz grupowania (()), jeśli nie zamierzasz ponownie korzystać z grupy, i dla mnie pozostaw spację przed nazwą pliku. Nie dlatego, że w tym przypadku wpłynie to na wynik końcowy, ale dla przykładu podaję polecenie sed, którego użyłem: sed / s. * Zmodyfikowano: * // '. Zweryfikowano w systemie Mac OS X 10.9.5.
Samuel

Grupowanie Samuela jest przydatne podczas testowania wyrażenia. Następnie mogę wydrukować dopasowanie w nawiasach kwadratowych, aby zobaczyć, że mam rację.
user877329,

1
@ Yourрослав twoje rozwiązanie dodaje zmodyfikowane i nieśledzone pliki i jest równe git add -u, więc nie odpowiada na pytanie.
Nick Volynkin

7
--modified wydaje się zawierać zarówno usunięte, jak i właśnie zmodyfikowane
DMart

2
git diff-files -z --diff-filter = M - tylko nazwa | xargs -0 git add --dry-run wydaje się działać dobrze.
DMart,

10
git commit -a -m "message"

-a: Obejmuje wszystkie aktualnie zmienione / usunięte pliki w tym zatwierdzeniu. Należy jednak pamiętać, że nieśledzone (nowe) pliki nie są uwzględniane.

-m: Ustawia komunikat zatwierdzenia


4

Nie powiedziałeś, co jest obecnie .gitignore, ale .gitignorez następującą zawartością w twoim katalogu głównym powinno załatwić sprawę.

.metadata
build

3
Źle korzystałem z mojego .gitignore. Miałem pusty plik .gitignore w każdym katalogu, który chciałem zignorować, zamiast mieć jednego gitignore z zawartością.
Steve,

1
@ Steve: To zadziałałoby, jeśli każdy. gitognorezawierał początek (zignoruj ​​wszystko). Ale jeden .gitignorew górnym katalogu jest zwykle o wiele prostszy w użyciu i wystarcza.
maaartinus

2

Zdarzyło mi się to wypróbować, aby najpierw zobaczyć listę plików:

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

cat ./file.sh

wykonać:

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

Edycja: (patrz komentarze) Można to osiągnąć w jednym kroku:

git status | grep "modified:" | awk '{print $2}' | xargs git add && git status

1
Można to osiągnąć jednym krokiem:git status | grep modified | awk '{print $2}' | xargs git add && git status
Choylton B. Higginbottom

Tak, powinienem również podać to rozwiązanie, dzięki, zaktualizowałem post.
Mike Q

1

Nie jestem pewien, czy jest to funkcja, czy błąd, ale działało to dla nas:

git commit '' -m "Message"

Zanotuj pustą listę plików ''. Git interpretuje to, aby zatwierdzić wszystkie zmodyfikowane pliki śledzone, nawet jeśli nie są one przemieszczane, i zignorować nieśledzone pliki.


To zdecydowanie nie działa, gdy używasz --amend.
GhostCat,

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.