Подтвердить что ты не робот

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

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

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

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

git add -u -except main/dontcheckmein.txt
4b9b3361

Ответ 1

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

Ответ 2

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

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

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

проверьте здесь

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

Сначала посмотрите на это Git глобальное игнорирование не работает

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

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

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

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

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

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

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

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

Ответ 3

Для файла

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

Для папки

git add -u
git reset -- main/*

Ответ 4

Теперь git поддерживает exclude certain paths and files с помощью волшебства pathspec :(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/*

Ответ 5

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

#!/bin/bash
set -e

git add -A
git reset `cat .gittrackignore`

И вот как выглядит мой текущий .gittrackignore.

project.properties

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

Ответ 6

Попробуйте следующее:

git checkout - main/dontcheckmein.txt

Ответ 7

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

пример

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

Ответ 8

Я использую 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.

Ответ 9

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

git add *.c

Из git-scm (или/и man git add):

git add <pathspec>…

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

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

git add **/main/*

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

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

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

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

git add *.c *.h

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

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

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

Ответ 10

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

Ответ 11

Чтобы сохранить изменения в файле, но не фиксировать, я сделал это

git add.

git reset -- main/dontcheckmein.txt

git commit -m "commit message"

чтобы убедиться, что файл исключен, сделайте

git status