Добавить все файлы в commit, кроме одного файла?

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

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

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

git add -u -except main/dontcheckmein.txt

9 ответов


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

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

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

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

регистрация здесь

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

первый взгляд на этот git global игнорировать не работает

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

Итак, если ваш файл находится в MyProject/MyFolder/myfile.txt (где .git также на MyProject), at .gitignore вы ставите только этот MyFolder/myfile.txt

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

о глобальном игноре

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

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

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

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


файл

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

В папке

git add -u
git reset -- main/*

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

#!/bin/bash
set -e

git add -A
git reset `cat .gittrackignore`

и это то, что мой нынешний .gittrackignore выглядит.

project.properties

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


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

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

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

git add --all -- :!path/to/file1 :!path/to/file2 :!path/to/folder1/*

попробуйте это:

git checkout -- main / dontcheckmein.txt


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

пример

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

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

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

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


для конкретного случая в вопросе самым простым способом было бы добавить все файлы с .c и Service где-то в их именем.

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

git add *.c *.h

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

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

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