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

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

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

git add -u -except main/dontcheckmein.txt

当前回答

虽然本·杰克逊是正确的,但我想我也会补充一下我是如何使用这个解决方案的。下面是我使用的一个非常简单的脚本(我称之为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。

其他回答

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

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

要撤消git更新索引,请假定“main/dontcheckmein.txt”不变

github文档忽略文件

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

首先,看看这篇stackoverflow文章:Git全局忽略不起作用

在.gitignore中,将相对路径添加到文件中,不以./开头。

因此,如果您的文件位于MyProject/MyFolder/myfile.txt(其中.git也位于MyProject文件夹中),请将MyFolder/myfile.txt添加到.git忽略文件中。

您可以通过git check ignore“MyFolder/myfile.txt”确认哪些规则与忽略相关

关于全局忽略

该链接涉及~/.gitignore_global,但该文件与您的项目相关。因此,如果将排除模式MyFolder/myfile.txt放在~/.gitignore_global中,它会起作用,但不会有太大意义。。。

另一方面,如果您使用git-config-core.excludsfile.gitignore来设置项目,其中.gitignore在MyProject中,则本地文件将覆盖~/.gitignore_global,它可能具有非常有用的规则。。。

因此,目前,我认为最好制作一些脚本,将.gitignore与~/.gitignore_global混合在.gitignor中。

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

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

试试看:

git checkout -- 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 add -u
git reset -- main/dontcheckmein.txt

对于文件夹

git add -u
git reset -- main/*