gitignore是否具有版本控制文件的等效项?

gitignore是否具有版本控制文件的等效项?,git,Git,这个问题与以下问题相关:,但是,提供的这些问题的答案似乎都不符合我的需要 我有一个由python脚本生成的头文件(key_info.h)。聪明的是,我用一行代码控制了标题的占位符版本(key_info.h): int i = you_need_to_run_the_key_info_gen_python_script_to_generate_this_file(); 在运行python脚本之前,编译此代码将产生一个错误,告诉开发人员要做什么;运行脚本 当然,开发人员将继续运行python脚本来

这个问题与以下问题相关:,但是,提供的这些问题的答案似乎都不符合我的需要

我有一个由python脚本生成的头文件(key_info.h)。聪明的是,我用一行代码控制了标题的占位符版本(key_info.h):

int i = you_need_to_run_the_key_info_gen_python_script_to_generate_this_file();
在运行python脚本之前,编译此代码将产生一个错误,告诉开发人员要做什么;运行脚本

当然,开发人员将继续运行python脚本来生成key_info.h的最新版本,代码将成功编译。然后,开发人员将继续进行一系列更改,然后“git提交”他们的代码

我们遇到的问题是key_info.h现在已经被修改了。同样地,git将把它作为一个修改,并允许它被提交。但是,此标头的生成版本不应受到版本控制。我们需要占位符版本保持不变,以便继续向开发人员提供编译错误提示

我的第一反应是使用.gitignore来阻止git在提交中获取key_info.h。gitignore很容易在开发人员之间共享,因为.gitignore本身是版本控制的。不幸的是,.gitignore只适用于不受版本控制的文件

我的下一个想法是使用“git更新索引——假定未更改/path/to/file”。这在本地非常有效,但我无法将此规则强制应用于其他开发人员。开发人员意外提交生成的头只是时间问题

所以我的问题是:有没有一种方法可以控制文件的版本,同时默默地强制执行一条规则,在提交更改时忽略该文件?我真正想要的是版本控制文件的.gitignore

但是我没有办法对其他开发者强制执行这个规则

您几乎可以这样做:您可以让您的key info gen脚本运行
git更新索引——假设未更改/some/path

但我认为这不是一个好主意

我可能会选择根本不覆盖头文件。让您的Python脚本生成正确的头文件并将其写入另一个目录,然后按正确的顺序传递这两个目录的
-I
编译器选项。如果脚本尚未运行,则会找到版本控制标头。如果脚本已运行,则会找到用户生成的标头。然后,您可以将用户生成的头的路径放在
.gitignore

这在本地非常有效,但我无法将此规则强制应用于其他开发人员

另一种方法是声明一个内容过滤器驱动程序,该驱动程序将在git add上自动将文件恢复到适当的内容

(来自)

您可以存储和共享:

  • 中的筛选器声明
  • 将还原内容的“
    clean
    ”脚本
但是:每个用户仍必须在其本地配置中注册该筛选器:

git config filter.<filtername>.clean ./<filterscript>
如果任何其他人使用了提供的内容,则将保留目标内容。
然后:

  • echo anypatternyoulike filter=pin content>.git/info/attributes
    使过滤器成为本地过滤器,或
  • …>>.gittattributes
    使其全局化

一些备选方案,排名和tl;被一个你从未见过的人发现:

  • 最好的方法是根本不跟踪文件,因为您拥有的是一个makefile目标。如果你不能得到或不想要一个
    make
    。。。任何IDE都可以配置构建配方,对吗

    ,一开始我没有找到它:将生成的头放在一个.gitignored
    generated headers
    目录中,让编译器首先搜索,并保留默认值作为备份

  • 如果您的构建过程不符合这一要求,那么下一个最好的方法就是,因为它对临时签出没有该文件的分支非常有效。tl;过滤器上的dr是“保留现有内容”:

    注意:,所以给出一个文件 一个被跟踪的属性将起作用,它将不会对其他人产生影响,直到他们想要它

  • 其次是规范方法,这是最容易实现的方法,只要文件在所有分支上都被跟踪,它就可以正常工作:

    git update-index --assume-unchanged key_info.h
    
    但是,当您临时切换到不跟踪该文件的分支时,它将在返回时失去这种保护


我建议通过重命名模板文件将模板文件从生成的文件中分离出来。然后,未配置的生成将由于缺少文件而失败(通过一些工作,可以使该文件的行为与您现在拥有的类似),但是版本控制系统可以安全地完全忽略该文件的存在,因为生成的文件将具有与模板不同的文件名。注意:,由于1.8.5过滤器获得路径名,您可以使过滤器设置独立,例如
git config filter.pin-content.clean'git show HEAD:%f 2>&-| | cat'
git config filter.pin-content.smudge'cat%f 2>&-| | cat'
,如果其他任何人使用所提供的内容,它将保留目标内容。然后
echo anypatternyoulike filter=pin content>>.git/info/attributes
使过滤器成为本地的,或者
..>.gittributes
使其成为全局的。@jthill很好的观点。我已将其包含在答案中,以提高可见性。
git config filter.pin-content.clean  'git show HEAD:%f 2>&- || cat'
git config filter.pin-content.smudge 'cat %f           2>&- || cat' 

echo anypatternyouwant filter=pin-content >>.gitattributes  # tracked, global
echo anypatternyouwant filter=pin-content >>.git/info/attributes # local-only
git update-index --assume-unchanged key_info.h