我有一堆文件在一个变更集中,但我想特别忽略一个修改过的文件。在 git status
之后看起来像这样:
# modified: main/dontcheckmein.txt
# deleted: main/plzcheckmein.c
# deleted: main/plzcheckmein2.c
...
我能否在执行git add
命令时忽略一个我不想处理的文本文件?类似这样:
git add -u -except main/dontcheckmein.txt
使用命令: git add .
使用命令: git status
使用命令: git reset -- file/to/path/file-to-ignore.txt
对于问题中的特定情况,最简单的方法是添加所有扩展名为.c的文件并排除其他所有文件:
git add *.c
从 git-scm(或/和man git add
):
git add <pathspec>…
要添加内容的文件。可以使用文件通配符(例如*.c)以添加所有匹配的文件。<...>
请注意,这意味着您也可以执行以下操作:
git add **/main/*
添加所有未被忽略的位于main
文件夹中的文件。您甚至可以使用更复杂的模式:
git add **/s?c/*Service*
s(any char)c
命名的文件夹中,并且文件名中包含 Service
的文件。git add *.c *.h
试试这个:
git checkout -- main/dontcheckmein.txt
我知道你的要求是关于编程的,虽然下面的方法不能一次完成你想要的结果,但最终可以达到你的目标。
在通过以下方式将所有文件添加到暂存区后:
git add -u
git status
将建议您:git restore --staged main/dontcheckmein.txt
您可以使用git的推荐功能
将所有文件更改添加并恢复不想推送的文件
git add .
git restore --staged <file_not_push>
我经常使用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
这样的环境变量来实现更常见的用例。.gitignore
。
将要忽略的文件添加到.git/info/exclude
中。它的工作方式与您的.gitignore
相同,只是配置是特定于您的机器。
使用pre-commit git hook重置要使用的文件。例如:
$ echo 'git reset -- src/main/resources/log4j.properties' >> .git/hooks/pre-commit
$ chmod +x .git/hooks/pre-commit
pre-commit钩子在提交之前运行。因此,您的文件可以在每次提交之前自动重置。
$ git status
On branch CHANGE-137-notifications-support ...
Changes not staged for commit:
modified: Dockerfile
modified: src/main/resources/log4j.properties
$ git add .
$ git status
On branch CHANGE-137-notifications-support ...
Changes to be committed:
modified: Dockerfile
modified: src/main/resources/log4j.properties
$ git commit -m "Trivial change"
Unstaged changes after reset:
M src/main/resources/log4j.properties
[CHANGE-137-notifications-support 97cfb3f] Trivial change
1 file changed, 3 insertions(+)
第三种方法是更新特定文件的索引。
$ git update-index --assume-unchanged src/main/resources/log4j.properties
$ git reset HEAD main/dontcheckmein.txt
$ git restore --staged main/dontcheckmein.txt
待提交的更改: (使用“git reset HEAD…”取消暂存)
git add * && git reset main/dontcheckmein.txt
git add -u:只缓存新建和修改的文件,不包括已删除的文件。
- Simeon