如何让git忽略对文件的未来修订?

Mar*_*arc 109 git gitattributes

我创建了一个包含在git存储库中的文件的默认版本.重要的是,当某人克隆存储库时,他们会获得此文件的副本.但是,我想设置git,以便稍后忽略对此文件的更改. .gitignore仅适用于未跟踪的文件.

我的动机是这个文件包含机器特定的信息.我想提供默认值,同时允许人们进行不会被推回原始存储库的本地更改,从而在我们提取新更改时创建合并冲突.

我们通常非常懒惰并且使用git add .很多,所以我很确定如果我不能告诉git忽略这个文件,对它的更改将最终得到提交和推送.

总结一下,

  1. 我想创建一个文件,调用它default_values.txt添加到我的git存储库,并在有人克隆该存储库时包含该文件.
  2. git add .不应该添加default_values.txt到提交.
  3. 应将此行为传递给存储库的任何克隆.

moo*_*oom 79

正如许多其他人所提到的,一个好的现代解决方案是:

git update-index --skip-worktree default_values.txt
Run Code Online (Sandbox Code Playgroud)

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

git update-index --no-skip-worktree default_values.txt
Run Code Online (Sandbox Code Playgroud)

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

git ls-files -v . | grep ^S
Run Code Online (Sandbox Code Playgroud)

请注意,与--skip-worktree不同,一旦上拉更改被拉出,--assume-unchanged状态将丢失.

  • 我将它们别名为“gitignore”和“git unignore”。 (5认同)
  • 如果其他人拉取 repo 并编辑文件,是否会忽略其目录中的更改?我希望他们必须输入 `--no-skip-worktree` 来添加他们的更改。 (3认同)
  • 请注意,如果在另一个分支中跟踪同一文件,则您可能必须在切换分支之前撤消文件的 `--skip-worktree` 状态。 (3认同)
  • 嗯,它有效...在我对文件进行了一些更改后,它没有显示在“git status”中,但是当我尝试签出到不同的分支时,我得到了“错误:您对以下文件的本地更改将是被结帐覆盖:`,甚至 -f 也无济于事`错误:条目'wix-stores-merchant-app/demo/credentials.js'不是最新的。无法合并。` (3认同)
  • 他们所做的改变是由他们控制的.换句话说,如果他们不希望推送他们的更改,他们必须在他们的仓库中设置skip-worktree文件.如果它是一个旨在发送给每个人的文件,然后忽略所有后续更改,则每个人都必须遵循这些相同的说明. (2认同)
  • @minseong `--skip-worktree` 是客户端功能。在服务器端,如果您的开发人员具有写入权限,则很难阻止他们做他们想做的事情。您可以让开发人员在其存储库的 .git/hooks/ 中添加预提交或预推送挂钩,以检查对此文件的更改,如果发现则禁止提交/推送。您仍然依赖您的开发人员正确使用该钩子,但也许这对于您的情况来说已经足够好了。[此处](https://superuser.com/a/991974/226988) 是一个示例。 (2认同)

tam*_*asd 48

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

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

  • 这不起作用.虽然它让git添加.忽略本地分支上的文件,归档的克隆没有此行为(如果更改克隆存档中的default_values.txt,它将通过"git add"添加到提交中.) (10认同)
  • @Indradhanush - 这个解决方案不满足标准3 - "行为应该传递给存储库的任何克隆" - 这就是为什么我不接受它.这并不意味着它不是一个好的答案. (7认同)
  • 是的,因为您只是为本地仓库设置它.你无法推动这类信息. (5认同)
  • 对于具有私有应用程序设置的本地配置文件,您可能希望使用`skip-worktree`而不是`assume-unchanged`更多信息http://stackoverflow.com/questions/13630849/git-difference-between-assume-unchanged-和跳worktree (3认同)

Lau*_*ves 19

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

  • 根据我的经验,这是解决此问题的最常见方法。这几乎是阻力最小的路径,因为它“正常工作”,您可以轻松地让代码检查本地配置文件是否存在,如果不存在则提供有用的错误。 (2认同)

Ada*_*ruk 5

看看涂抹/清洁脚本.通过这种方式,您可以对文件进行版本控制,但在检出文件时,您将通过将通用/占位符数据替换为文件中的机器特定数据来"涂抹"它.

提交时,您将通过使用通用或占位符信息替换机器特定信息来"清理"它.

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

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