我怎样才能让git忽略未来版本的修改?
我创build了一个包含在git仓库中的文件的默认版本。 当有人克隆版本库时,他们得到这个文件的副本是很重要的。 但是,我想设置git,以便稍后忽略此文件的更改。 .gitignore
仅适用于未跟踪的文件。
我的动机是这个文件包含特定于计算机的信息。 我想提供默认值,同时允许人们进行本地更改,不会被推回原始存储库,当我们提出新的更改时,创build合并冲突。
我们一般很懒,使用git add .
很多,所以我敢肯定,如果我不能告诉git忽略这个文件,对它的更改将最终被提交和推送。
总而言之,
- 我想创build一个文件,将其称为
default_values.txt
添加到我的git存储库,并包含在克隆该存储库时。 -
git add .
不应该将default_values.txt
添加到提交中。 - 这个行为应该被传递给仓库的任何克隆。
像其他人所说的那样,一个好的现代解决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应该忽略它。