我怎样才能让git忽略未来版本的修改?

我创build了一个包含在git仓库中的文件的默认版本。 当有人克隆版本库时,他们得到这个文件的副本是很重要的。 但是,我想设置git,以便稍后忽略此文件的更改。 .gitignore仅适用于未跟踪的文件。

我的动机是这个文件包含特定于计算机的信息。 我想提供默认值,同时允许人们进行本地更改,不会被推回原始存储库,当我们提出新的更改时,创build合并冲突。

我们一般很懒,使用git add . 很多,所以我敢肯定,如果我不能告诉git忽略这个文件,对它的更改将最终被提交和推送。

总而言之,

  1. 我想创build一个文件,将其称为default_values.txt添加到我的git存储库,并包含在克隆该存储库时。
  2. git add . 不应该将default_values.txt添加到提交中。
  3. 这个行为应该被传递给仓库的任何克隆。

像其他人所说的那样,一个好的现代解决scheme是:

 git update-index --skip-worktree default_values.txt 

这将忽略对本地和上游文件的更改,直到您决定再次允许它们:

 git update-index --no-skip-worktree default_values.txt 

您可以获取被标记为跳过的文件列表:

 git ls-files -v . | grep ^S 

请注意,与–skip-worktree不同,一旦上游更改被取消,–assume-unchanged状态将会丢失。

你正在寻找的是git update-index --assume-unchanged default_values.txt

有关更多详细信息,请参阅文档: http : //www.kernel.org/pub/software/scm/git/docs/git-update-index.html

我通常看到的方法是创build一个不同名称的文件,例如:default_values_template.txt,并将.gitignore中的default_values.txt。 指导人们将default_values_template.txt复制到本地工作空间的default_values.txt中,并根据需要进行更改。

看看涂抹/干净的脚本。 通过这种方式,您可以对文件进行版本控制,但在检出文件时,将通过将文件中的机器特定数据replace为通用/占位符数据来“涂抹”文件。

当您提交它时,您将通过用通用或占位符信息replace机器特定信息来“清除”它。

涂抹/清理脚本必须是确定性的,因为应用它们多次,按照不同的顺序将等同于仅运行序列中的最后一个。

如果您需要公开您的存储库,但是内容可能包含敏感信息,则可以使用密码。

我已经通过定义“干净”filter来解决这个问题,简单地在索引中捕获文件的内容。

git show :path/to/myfile应该只是打印指定文件的索引内容,所以我们可以在脚本中使用它来replace索引中未被触及的副本的工作副本:

 #! /bin/sh git show :$1 

设置为相关文件的“干净”filter(假设你已经把它放在“discard_changes”中):

 $ git config filter.ignore_myfile.clean "discard_changes path/to/myfile" $ echo "path/to/myfile filter=ignore_myfile" >> .gitattributes 

不幸的是,我无法find一种方法来使这个通用的多个文件,因为没有办法来告诉我们正在处理从干净的脚本里面的文件。 当然,没有什么可以阻止你为每个文件添加一个不同的过滤规则,但这有点过头。

我build议寻找子模块。 如果你把机器特定的文件放在子模块中,git add应该忽略它。