Добавить все файлы в коммит, кроме одного? - PullRequest
464 голосов
/ 18 декабря 2010

У меня есть набор файлов в наборе изменений, но я хочу специально игнорировать один измененный файл.Выглядит так после git status:

# modified:   main/dontcheckmein.txt
# deleted:    main/plzcheckmein.c
# deleted:    main/plzcheckmein2.c
...

Есть ли способ, которым я могу сделать git add, но просто проигнорировать один текстовый файл, который я не хочу трогать?Что-то вроде:

git add -u -except main/dontcheckmein.txt

Ответы [ 10 ]

714 голосов
/ 18 декабря 2010
git add -u
git reset -- main/dontcheckmein.txt
115 голосов
/ 03 мая 2014

1) Чтобы начать игнорировать изменения в одном уже версионном файле

git update-index --assume-unchanged "main/dontcheckmein.txt"

и отменить это git update-index --no-assume-unchanged "main/dontcheckmein.txt"

отметьте здесь

2) Полное игнорирование определенного отдельного файла, препятствующее его созданию в хранилище

Сначала посмотрите на это Git global ignore не работает

и на .gitignore добавьте относительный путь к файлу без начальных символов ./

, поэтому, если ваш файл имеет значение MyProject/MyFolder/myfile.txt (где .git также равно MyProject.gitignore вы положили только это MyFolder/myfile.txt

. Вы можете подтвердить, какое правило относится к игнорированию, с помощью git check-ignore "MyFolder/myfile.txt"

О глобальном игнорировании

Эта ссылка говорит о ~/.gitignore_global;но файл связан с вашим проектом;поэтому, если вы установите шаблон исключения MyFolder/myfile.txt на ~/.gitignore_global, он будет работать, но не будет иметь особого смысла ...

С другой стороны, если вы настроите свой проект с помощью git config core.excludesfile .gitignore, где .gitignore находится на MyProject;эта установка переопределит ~/.gitignore_global, которая может иметь очень полезных правил ...

Итак, на данный момент, я думаю, что лучше всего сделать какой-нибудь скрипт для смешивания вашего .gitignore с ~/.gitignore_global at .gitignore.

Последнее предупреждение
Если файл, который вы хотите игнорировать, уже находится в хранилище, этот метод не будет работать, если вы не сделаете следующее: git rm "MyFolder/myfile.txt", но сначала сделайте резервную копию, так как она также будет удалена локально!Вы можете скопировать его позже ...

64 голосов
/ 14 октября 2014

Для файла

git add -u
git reset -- main/dontcheckmein.txt

Для папки

git add -u
git reset -- main/*
33 голосов
/ 19 августа 2018

Теперь git поддерживает exclude certain paths and files магией пути :(exclude) и его краткой формой :!. Таким образом, вы можете легко добиться этого, выполнив следующую команду.

git add --all -- :!main/dontcheckmein.txt
git add -- . :!main/dontcheckmein.txt

На самом деле вы можете указать больше:

git add --all -- :!path/to/file1 :!path/to/file2 :!path/to/folder1/*
git add -- . :!path/to/file1 :!path/to/file2 :!path/to/folder1/*
19 голосов
/ 14 марта 2013

Хотя Бен Джексон и прав, я подумал, что добавлю, как я использую это решение.Ниже приведен очень простой скрипт, который я использую (который я называю gitadd), чтобы добавить все изменения, кроме нескольких избранных, которые я держу в списке в файле с именем .gittrackignore (очень похоже на то, как работает .gitignore).1004 * И вот как выглядит мой текущий .gittrackignore.

project.properties

Я работаю над проектом Android, который компилируется из командной строки при развертывании.Этот проект зависит от SherlockActionBar, поэтому на него нужно ссылаться в project.properties, но это мешает компиляции, поэтому теперь я просто набираю gitadd и добавляю все изменения в git без необходимости каждый раз удалять add.propertiesразовое.

4 голосов
/ 08 августа 2016

Попробуйте:

git checkout - main / dontcheckmein.txt

3 голосов
/ 28 мая 2018

Используйте git add -A для одновременного добавления всех измененных и вновь добавленных файлов.

Пример

git add -A
git reset -- main/dontcheckmein.txt
0 голосов
/ 13 ноября 2018

Изменения, которые необходимо совершить: (используйте «git reset HEAD ...» для удаления)

0 голосов
/ 06 марта 2018

Для конкретного случая, о котором идет речь, проще всего было бы добавить все файлы с расширением .c и пропустить все остальное:

git add *.c

С git-scm (или / и man git add):

git add …

Файлы для добавления контента. Fileglobs (например, * .c) могут быть предоставлены для добавления всех соответствующих файлов. <...>

Обратите внимание, что это означает, что вы также можете сделать что-то вроде:

git add **/main/*

для добавления всех файлов (которые не игнорируются), которые находятся в папке main. Вы даже можете сойти с ума с более сложными образцами:

git add **/s?c/*Service*

Выше будут добавлены все файлы, которые находятся в папке s(any char)c и имеют Service где-то в имени файла.

Очевидно, вы не ограничены одним шаблоном на команду. То есть вы можете попросить git добавить все файлы с расширением .c и .h :

git add *.c *.h

Эта ссылка может дать вам еще несколько идей о шаблонах глобуса.

Я нахожу это особенно полезным, когда я делаю много изменений, но все же хочу, чтобы мои коммиты оставались атомарными и отражали постепенный процесс, а не мешанину изменений, над которыми я, возможно, работаю в то время. Конечно, в какой-то момент стоимость разработки сложных шаблонов превышает стоимость добавления файлов более простыми методами или даже одного файла за раз. Тем не менее, в большинстве случаев я легко могу указать только нужные мне файлы простым шаблоном и исключить все остальное.

Кстати, вам может нужно процитировать ваши шаблоны глобуса, чтобы они работали, но это никогда не имело место для меня.

0 голосов
/ 11 марта 2016

Я использую git add --patch совсем немного и хотел что-то подобное, чтобы избежать необходимости постоянно нажимать d через одни и те же файлы.Я выполнил очень хакерскую пару псевдонимов git, чтобы выполнить работу:

[alias]
    HELPER-CHANGED-FILTERED = "!f() { git status --porcelain | cut -c4- | ( [[ \"$1\" ]] && egrep -v \"$1\" || cat ); }; f"
    ap                      = "!git add --patch -- $(git HELPER-CHANGED-FILTERED 'min.(js|css)$' || echo 'THIS_FILE_PROBABLY_DOESNT_EXIST' )"

В моем случае я просто хотел постоянно игнорировать определенные минимизированные файлы, но вы могли бы заставить его использовать переменную окружения, такую ​​как$GIT_EXCLUDE_PATTERN для более общего случая использования.

...