我在一个变更集中有一堆文件,但我想特别忽略一个修改过的文件。在git状态后看起来如下:

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

有没有一种方法可以让我添加git,但忽略我不想触摸的一个文本文件?类似于:

git add -u -except main/dontcheckmein.txt

当前回答

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

git添加。

git reset--main/dontcheckmein.txt

gitcommit-m“提交消息”

要验证文件是否被排除,请执行以下操作

git状态

其他回答

git add .
git reset main/dontcheckmein.txt

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

git add *.c

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

git-add<pathspec>…​要从中添加内容的文件。可以使用Fileglobs(例如*.c)来添加所有匹配的文件。<…>

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

git add **/main/*

添加主文件夹中的所有文件(未忽略)。你甚至可以用更复杂的模式来疯狂:

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

上面将添加s(任意字符)c文件夹中的所有文件,并且文件名中有Service。

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

git add *.c *.h

这个链接可能会给你更多的地球模式的想法。

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

顺便说一句,你可能需要引用你的glob模式来让它们工作,但我从来没有这样做过。

试试看:

git checkout -- main/dontcheckmein.txt

我经常使用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支持通过pathspec magic:(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/*'