git додає лише модифіковані зміни та ігнорує незатребувані файли


658

Я запустив "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

Відповіді:


904

В ідеалі, ви .gitignoreповинні запобігти відображенню в статусі неагрекованих (і проігнорованих) файлів, додавання за допомогою git addтощо. Тому я б просив вас виправити.gitignore

Ви можете зробити git add -uтак, щоб він налаштував зміни і видалені файли.

Ви також можете git commit -aввести лише змінені та видалені файли.

Зауважте, що якщо у вас є версія Git до версії 2.0 та ви її використовували git add ., тоді вам потрібно буде скористатися git add -u .(див. " Різниця" git add -A"та" git add ." ").


74
Цікаво, це ( add -u) не додає лише modified файли, а також "додає" deletedті, що я зараз намагаюся запобігти.
Zach Lysobey

6
Щоб додати лише модифіковані файли, я зазвичай перейду до верхнього каталогу мого репо і введіть for fil in $(git diff --name-only --relative); do git add $fil; done. Якби я його багато використовував (я цього не роблю), я б просто створив псевдонім для цього у своєму ~/.bashrcфайлі. Це, звичайно, працює лише в басі.
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
Hugo

96

Це працювало для мене:

#!/bin/bash

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

Або ще краще:

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

Вам не потрібно групувати (()), якщо ви не збираєтесь повторно використовувати групу, і \ s залишено пробіл перед іменем файлу для мене. Не те, що це вплине на кінцевий результат у цьому випадку, але заради встановлення прикладу ось команда sed, яку я використав: sed 's /.* модифікований: * //'. Підтверджено на Mac OS X 10.9.5.
Самуїл

@Samuel Групування приємно під час тестування виразу. Тоді я можу роздрукувати сірник у квадратних дужках, щоб побачити, що я правий.
user877329

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

7
- модифікація, здається, включає видалені, а також щойно змінені
DMart

2
git diff-файли -z --diff-filter = M - лише ім'я | xargs -0 git add - сушитися, здається, працює добре.
DMart

10
git commit -a -m "message"

-a: Включає всі змінені / видалені в цей час файли в цю комісію. Але майте на увазі, що відслідковувані (нові) файли не входять.

-m: Встановлює повідомлення комісії


4

Ви не сказали, що на даний момент є вашим .gitignore, але .gitignoreз наступним вмістом у вашому кореневому каталозі слід зробити це.

.metadata
build

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

1
@Steve: Це спрацювало б, якщо кожен. gitognoreмістив початок (ігноруйте все). Але один .gitignoreу верхньому каталозі, як правило, набагато простіший у використанні і достатній.
maaartinus

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
Чойлтон Б. Хіггінботтом,

Так, я повинен був би забезпечити це рішення також, дякую, я оновив пост.
Майк Q

1

Не впевнений, це функція чи помилка, але це працювало для нас:

git commit '' -m "Message"

Зверніть увагу на порожній список файлів ''. Git інтерпретує це для внесення всіх модифікованих відстежених файлів, навіть якщо вони не ставляться на етапі, і ігнорує відслідковувані файли.


Це однозначно не працює при використанні --amend.
GhostCat

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.