739

我在变更集中有一堆文件,但我想专门忽略一个修改过的文件。之后看起来像这样git status

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

有没有办法我可以做git add,但只是忽略一个我不想触摸的文本文件?就像是:

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

18 回答 18

1034
git add -u
git reset -- main/dontcheckmein.txt
于 2010-12-17T23:00:00.177 回答
212

现在git支持exclude certain paths and filespathspec 魔术:(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/*'
于 2018-08-19T03:21:26.400 回答
180

1) 开始忽略对单个已版本化文件的更改

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

并撤消它git update-index --no-assume-unchanged "main/dontcheckmein.txt"

github docs忽略文件

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 .gitignorewhere .gitignoreis in设置项目MyProject,则本地文件将覆盖~/.gitignore_global,这可能具有非常有用的规则...

所以,就目前而言,我认为最好制作一些脚本来混合你.gitignore~/.gitignore_globalat .gitignore

最后一个警告
如果您要忽略的文件已经在存储库中,则此方法将不起作用,除非您这样做:git rm "MyFolder/myfile.txt",但首先备份它,因为它也会在本地删除!以后可以复制回来...

于 2014-05-03T00:35:40.117 回答
103

对于文件

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

对于文件夹

git add -u
git reset -- main/*
于 2014-10-14T11:24:27.027 回答
22

虽然 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。

于 2013-03-14T01:10:39.043 回答
17

为了保留文件中的更改但不提交,我这样做了

git add .

git reset -- main/dontcheckmein.txt

git commit -m "commit message"

验证文件是否被排除

git status

于 2019-07-17T20:27:50.367 回答
10
git add .
git reset main/dontcheckmein.txt
于 2020-02-11T12:50:49.810 回答
6

用于git add -A一次添加所有修改和新添加的文件。

例子

git add -A
git reset -- main/dontcheckmein.txt
于 2018-05-28T19:05:30.447 回答
5

我们可以添加所有文件并排除必须通过 git reset 删除的文件。

git add .
git reset -- <file_name_to_exclude>
于 2020-12-19T23:06:55.713 回答
3
于 2018-03-06T12:47:39.357 回答
2

Git 为:(exclude)要排除的路径提供 pathspecs 前缀。

它的简短魔法签名是:^
文档:https ://git-scm.com/docs/gitglossary#Documentation/gitglossary.txt-exclude

git add . :^main/dontcheckmein.txt

该线程的一些答案提到:!,这也可以使用,但只能使用引号。一般来说,!被认为是 shell 扩展的可怕字符。


如果你像我一样——总是在命令中使用-pflag查看将要提交的内容——魔术签名也像一个魅力一样工作:git add:^

git add -p . :^main/dontcheckmein.txt
于 2021-12-27T11:43:11.833 回答
2

尝试这个:

git checkout -- main/dontcheckmein.txt
于 2016-08-08T16:13:24.540 回答
0

如果您想每次都忽略特定文件,则有三种有效的解决方案不涉及.gitignore.

  1. 将要忽略的文件添加到.git/info/exclude. 它和你的一样工作.gitignore,除了配置是特定于你的机器的

  2. 使用预提交 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(+)
    
  3. 第三种方法是更新特定文件的索引。

    $ git update-index --assume-unchanged src/main/resources/log4j.properties
    
于 2021-12-23T06:51:54.873 回答
0

我使用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更一般的用例。

于 2016-03-11T06:01:57.037 回答
0

添加所有文件

混帐添加。

获取要粘贴到下面的文件路径

状态

从提交中删除

git reset -- file/to/path/file-to-ignore.txt

于 2022-02-09T11:07:47.443 回答
0

要提交的更改:(使用“git reset HEAD ...”取消暂存)

于 2018-11-13T17:56:49.650 回答
0

不是你直接问的,因为它不能在一个命令中实现,但结果应该是你想要的。

通过将所有文件添加到暂存区域后

git add -u

打字git status会建议你

git restore --staged main/dontcheckmein.txt
于 2021-03-10T13:42:22.923 回答
-2

你可以试试这个:git add * && git reset main/dontcheckmein.txt

于 2020-05-29T13:50:06.723 回答