我在变更集中有一堆文件,但我想专门忽略一个修改过的文件。之后看起来像这样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 -u
git reset -- main/dontcheckmein.txt
现在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/*
对于 Mac 和 Linux,用引号将每个文件/文件夹路径括起来
git add --all -- ':!path/to/file1' ':!path/to/file2' ':!path/to/folder1/*'
1) 开始忽略对单个已版本化文件的更改
git update-index --assume-unchanged "main/dontcheckmein.txt"
并撤消它git update-index --no-assume-unchanged "main/dontcheckmein.txt"
2)完全忽略特定的单个文件,防止它在存储库中创建
首先,看看这个stackoverflow帖子:Git global ignore not working
在.gitignore
中,添加文件的相对路径,不带前导./
。
因此,如果您的文件位于MyProject/MyFolder/myfile.txt
, (文件夹.git
中也位于其中MyProject
),请添加MyFolder/myfile.txt
到您的 at.gitignore
文件中。
您可以通过以下方式确认哪些规则与忽略相关联git check-ignore "MyFolder/myfile.txt"
关于全局忽略
该链接谈论~/.gitignore_global
,但该文件与您的项目相关。所以,如果你把排除模式放进去MyFolder/myfile.txt
,~/.gitignore_global
它会起作用,但没有多大意义......
另一方面,如果您使用git config core.excludesfile .gitignore
where .gitignore
is in设置项目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/*
虽然 Ben Jackson 是正确的,但我想我也会添加我一直在使用该解决方案的方式。下面是我使用的一个非常简单的脚本(我称之为 gitadd)添加所有更改,除了我保留在一个名为的文件中列出的少数更改.gittrackignore
(非常类似于 .gitignore 的工作方式)。
#!/bin/bash
set -e
git add -A
git reset `cat .gittrackignore`
这就是我现在的.gittrackignore
样子。
project.properties
我正在开发一个在部署时从命令行编译的 Android 项目。该项目依赖于 SherlockActionBar,因此需要在 project.properties 中引用它,但这会干扰编译,所以现在我只需键入gitadd
并将所有更改添加到 git,而不必每次都取消添加 project.properties。
为了保留文件中的更改但不提交,我这样做了
git add .
git reset -- main/dontcheckmein.txt
git commit -m "commit message"
验证文件是否被排除
git status
git add .
git reset main/dontcheckmein.txt
用于git add -A
一次添加所有修改和新添加的文件。
例子
git add -A
git reset -- main/dontcheckmein.txt
我们可以添加所有文件并排除必须通过 git reset 删除的文件。
git add .
git reset -- <file_name_to_exclude>
Git 为:(exclude)
要排除的路径提供 pathspecs 前缀。
它的简短魔法签名是:^
。
文档:https ://git-scm.com/docs/gitglossary#Documentation/gitglossary.txt-exclude
git add . :^main/dontcheckmein.txt
该线程的一些答案提到:!
,这也可以使用,但只能使用引号。一般来说,!
被认为是 shell 扩展的可怕字符。
如果你像我一样——总是在命令中使用-p
flag查看将要提交的内容——魔术签名也像一个魅力一样工作:git add
:^
git add -p . :^main/dontcheckmein.txt
尝试这个:
git checkout -- main/dontcheckmein.txt
如果您想每次都忽略特定文件,则有三种有效的解决方案不涉及.gitignore
.
将要忽略的文件添加到.git/info/exclude
. 它和你的一样工作.gitignore
,除了配置是特定于你的机器的。
使用预提交 git hook重置您要使用的文件。例如:
$ echo 'git reset -- src/main/resources/log4j.properties' >> .git/hooks/pre-commit
$ chmod +x .git/hooks/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 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
更一般的用例。
混帐添加。
状态
git reset -- file/to/path/file-to-ignore.txt
要提交的更改:(使用“git reset HEAD ...”取消暂存)
不是你直接问的,因为它不能在一个命令中实现,但结果应该是你想要的。
通过将所有文件添加到暂存区域后
git add -u
打字git status
会建议你
git restore --staged main/dontcheckmein.txt
你可以试试这个:git add * && git reset main/dontcheckmein.txt