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

时间:2010-12-03 18:23:49

标签: git gitattributes

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

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

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

总结一下,

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

7 个答案:

答案 0 :(得分:60)

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

renderer.animate(
    element,
    {
      styles: [{'opacity': this.temp}]
    },
    [
      {
        offset: .5,
        styles: {
          styles: [
            {'opacity' : .5}
          ]
        }
      },
      {
        offset: 1,
        styles: {
          styles: [
            {'opacity' : 1}
          ]
        }
      }
    ],
    2,
    1,
    'linear'
)

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

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

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

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

请注意,与--skip-worktree不同,一旦上拉变换被拉动,--assume-unchanged状态将会丢失。

答案 1 :(得分:46)

您要搜索的是git update-index --assume-unchanged default_values.txt

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

答案 2 :(得分:19)

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

答案 3 :(得分:5)

看一下涂抹/清理脚本。通过这种方式,您可以对文件进行版本控制,但是当它被检出时,您将通过用文件中的机器特定数据替换通用/占位符数据来“涂抹”它。

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

涂抹/清洁脚本必须具有确定性,因为多次应用它们会以不同的顺序运行,只相当于运行序列中的最后一个。

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

答案 4 :(得分:3)

我通过定义“干净”过滤器来解决这个问题,只是简单地捕获索引中文件的内容。

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

#! /bin/sh

git show :$1

将其设置为相关文件的“干净”过滤器(假设您已将其放入“discard_changes”):

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

不幸的是,我无法找到一种方法来使这个通用对多个文件,因为没有办法告诉我们在干净的脚本中处理哪个文件。当然,没有什么可以阻止你为每个文件添加不同的过滤规则,但它有点笨拙。

答案 5 :(得分:1)

我找到了适用于我的团队的解决方案。我们通过符号链接分享我们的githooks,在向git添加模板文件后,我添加了一个预提交钩子,用于检查模板文件是否已被修改,如果是,我git reset -- templatefile.txt。如果它是唯一更改的文件,我也会中止提交。

答案 6 :(得分:0)

我建议查看子模块。如果将机器特定文件放在子模块中,git add应忽略它。