将所有文件添加到提交中,除了单个文件?

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

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

有没有一种方法可以做到git add,但只忽略我不想碰的一个文本文件?类似于:

git add -u -except main/dontcheckmein.txt
516768 次浏览
git add -ugit reset -- main/dontcheckmein.txt

说明:Git随后为此添加了特殊的语法,这在其他答案中进行了解释。

虽然Ben Jackson是正确的,但我想我也会添加我如何使用该解决方案。下面是我使用的一个非常简单的脚本(我称之为gitadd)来添加所有更改,除了我在名为.gittrackignore的文件中列出的少数更改(非常类似于. gitignore的工作方式)。

#!/bin/bashset -e
git add -Agit reset `cat .gittrackignore`

这就是我现在的.gittrackignore的样子。

project.properties

我正在开发一个Android项目,我在部署时从命令行编译。这个项目依赖于SherlockActionBar,所以需要在project.properties中引用它,但这会扰乱编译,所以现在我只需键入gitadd并将所有更改添加到git,而无需每次取消添加project.properties。

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

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

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

github忽略文件的文档

2)完全忽略特定的单个文件,防止它在存储库中创建

首先,看看这个stackoverflow帖子:Git全局忽略不工作

.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设置项目,其中.gitignore位于MyProject中,则本地文件将覆盖~/.gitignore_global,它可以具有非常有用的规则

所以,现在,我认为最好做一些脚本来混合你的.gitignore.gitignore~/.gitignore_global

最后一次警告
如果您要忽略的文件已经在存储库中,则此方法将无法工作,除非您执行以下操作:git rm "MyFolder/myfile.txt",但首先备份它,因为它也将在本地删除!您可以稍后将其复制回来…

对于一个文件

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

为了一个文件夹

git add -ugit reset -- main/*

我经常使用git add --patch,并希望这样的东西来避免在相同的文件中一直命中d。我制作了几个非常hacky的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 checkout -- main/dontcheckmein.txt

对于问题中的特定情况,最简单的方法是添加扩展名为. c的所有文件并省略其他所有内容:

git add *.c

git-scm(或/和man git add):

git add

要添加内容的文件。可以提供Filegb(例如*. c)来添加所有匹配的文件。<…>

请注意,这意味着您还可以执行以下操作:

git add **/main/*

添加main文件夹中的所有文件(未被忽略)。您甚至可以使用更精细的模式来疯狂:

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

上面将添加s(any char)c文件夹中的所有文件,并且文件名中有Service

显然,您不仅限于每个命令一种模式。也就是说,您可以要求git添加扩展名为. c. h的所有文件:

git add *.c *.h

这个链接可能会给你一些更多的全局模式的想法。

当我进行许多更改时,我发现它特别有用,但我仍然希望我的提交保持原子并反映渐进的过程,而不是我当时可能正在处理的更改的大杂菜。当然,在某些时候,提出精细模式的成本超过了使用更简单方法添加文件的成本,甚至一次一个文件。然而,大多数时候,我可以很容易地使用简单模式确定我需要的文件,并排除其他所有内容。

顺便说一句,你需要引用你的全局模式才能工作,但这对我来说从来都不是这样。

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

示例

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

现在git通过路径规范魔法:(exclude)及其简写形式:!支持exclude certain paths and files。因此您可以通过以下命令轻松实现它。

git add --all -- :!main/dontcheckmein.txtgit 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/*'

要提交的更改:(使用“git重置HEAD…”取消暂存)

将更改保存在文件中但不提交我这样做了

git add .

git reset -- main/dontcheckmein.txt

git commit -m "commit message"

以验证文件是否被排除

git status

git add .git reset main/dontcheckmein.txt

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

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

git add .git reset -- <file_name_to_exclude>

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

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

git add -u

输入git status会建议您

git restore --staged main/dontcheckmein.txt

如果您想在每次有三个不涉及.gitignore的有效解决方案时忽略特定文件。

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

  2. 重置要使用预提交git钩子的文件。例如:

    $ echo 'git reset -- src/main/resources/log4j.properties' >> .git/hooks/pre-commit$ chmod +x .git/hooks/pre-commit

    预提交钩子在提交之前运行。因此您的文件可以在每次提交之前自动重置。

    $ git statusOn branch CHANGE-137-notifications-support ...
    Changes not staged for commit:modified:   Dockerfilemodified:   src/main/resources/log4j.properties
    $ git add .
    $ git statusOn branch CHANGE-137-notifications-support ...
    Changes to be committed:modified:   Dockerfilemodified:   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 change1 file changed, 3 insertions(+)
  3. 第三种方法是更新特定文件的索引。

    $ git update-index --assume-unchanged src/main/resources/log4j.properties

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

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

git add . :^main/dontcheckmein.txt

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


如果你像我一样-总是在git add命令中使用-p标志查看将要提交的内容-:^魔法签名也像魅力一样:

git add -p . :^main/dontcheckmein.txt

添加所有文件

git add

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

git状态

从提交中删除

git重置-file/to/path/file-to-ignore.txt