git добавляет только измененные изменения и игнорирует неотслеживаемые файлы


659

Я запустил «git status» и перечислил ниже несколько файлов, которые были изменены / или под заголовком «изменения, не подготовленные для фиксации». В нем также перечислены некоторые неотслеживаемые файлы, которые я хочу игнорировать (у меня есть файл «.gitignore» в этих каталогах).

Я хочу поместить измененные файлы в стадию, чтобы я мог их зафиксировать. Когда я запустил «git add.», Он добавил измененные файлы И файлы, которые я хочу игнорировать, для постановки.

Как добавить только измененные файлы и игнорировать неотслеживаемые файлы, если они представлены со статусом git ниже.

Кроме того, мои файлы ".gitignore" работают правильно?

$ 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
Если вы добавили файл .gitignore ПОСЛЕ отслеживания файлов, то файл .gitignore не будет игнорировать файлы, которые уже отслеживаются. это может быть проблемой.
BKSpurgeon

Ответы:


905

В идеале вы .gitignoreдолжны предотвратить отображение неотслеживаемых (и игнорируемых) файлов в статусе, добавлять их с помощью git addи т. Д. Поэтому я бы попросил вас исправить ваши.gitignore

Вы можете сделать git add -uтак, чтобы он установил измененные и удаленные файлы.

Вы также можете сделать git commit -aдля фиксации только измененные и удаленные файлы.

Обратите внимание, что если у вас есть Git версии до 2.0 и используется git add ., то вам нужно будет использовать git add -u .(см. « Разница между« git add -A»и« git add .» »).


74
Интересно, что this ( add -u) добавляет не только modified файлы, но и «добавляет» deletedте, что я сейчас пытаюсь предотвратить.
Зак Лысобей

6
Чтобы добавить только измененные файлы, я обычно захожу в верхний каталог моего репо и печатаю for fil in $(git diff --name-only --relative); do git add $fil; done. Если бы я использовал это много (я не использую), я бы просто сделал псевдоним для этого в моем ~/.bashrcфайле. Это, конечно, работает только в bash.
Krøllebølle

8
Нет определенного ответа, только ответы "работает для большинства людей"? Я должен использовать другой процесс, чтобы сделать это правильно? Как это не встроено в git add? Кажется, что такое обычное дело хотеть сделать.
Самуил

2
nb методы, упомянутые в этих комментариях, потерпят неудачу, если у вас есть нечетные имена файлов (пробелы, звездочки, что нет). Чтобы правильно экранировать любые файлы со странным именем, используйте:IFS=$(echo -en "\n\b"); for file in $(git diff --name-only); do git add "$file"; done
Orwellophile

3
git add -uкоротка git add --updateи git commit -aкороткаgit commit --all
Гюго

96

Это сработало для меня:

#!/bin/bash

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

Или даже лучше:

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

Вам не нужно группировать (()), если вы не собираетесь повторно использовать группу, и \ s оставьте пробел перед именем файла для меня. Не то, чтобы это повлияло на конечный результат в этом случае, но для примера приведу команду sed, которую я использовал: sed 's /.*ified: * //'. Проверено на Mac OS X 10.9.5.
Самуил

Группировка @Samuel хороша при тестировании выражения. Затем я могу напечатать спичку в квадратных скобках, чтобы убедиться, что я прав.
user877329

1
@ Ярослав ваше решение добавляет измененные и неотслеживаемые файлы и равнозначно git add -u, поэтому оно не отвечает на вопрос.
Николай Волынкин

7
- Изменено, кажется, включает как удаленные, так и только что измененные
DMart

2
git diff-files -z --diff-filter = M - только для имени | xargs -0 git add --dry-run работает хорошо.
DMart

10
git commit -a -m "message"

-a: Включает все измененные / удаленные файлы в этот коммит. Имейте в виду, однако, что неотслеживаемые (новые) файлы не включены.

-m: устанавливает сообщение коммита


4

Вы не сказали, что в данный момент принадлежит вам .gitignore, но .gitignoreсо следующим содержимым в вашем корневом каталоге следует добиться цели.

.metadata
build

3
Я использовал мой .gitignore все неправильно. У меня был пустой файл .gitignore в каждом каталоге, который я хотел игнорировать, вместо того, чтобы иметь один gitignore с содержимым в нем.
Стив

1
@ Стив: Это будет работать, если каждый. gitognoreсодержит начало (игнорировать все). Но единственный .gitignoreв верхнем каталоге, как правило, гораздо проще в использовании и достаточно.
Маартин

2

Я попробовал это, чтобы сначала увидеть список файлов:

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

cat ./file.sh

выполнить:

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

Изменить: (см. Комментарии) Это может быть достигнуто за один шаг:

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

1
Этого можно достичь за один шаг:git status | grep modified | awk '{print $2}' | xargs git add && git status
Чойлтон Б. Хиггинботтом

Да, я должен был предоставить это решение, спасибо, я обновил пост.
Майк К,

1

Не уверен, что это особенность или ошибка, но у нас это сработало:

git commit '' -m "Message"

Обратите внимание на пустой список файлов. Git интерпретирует это, чтобы зафиксировать все измененные отслеживаемые файлы, даже если они не являются промежуточными, и игнорировать неотслеживаемые файлы.


Это определенно не работает при использовании --amend.
GhostCat

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.