gitignore是否具有版本控制文件的等效项?
这个问题与以下问题相关:,但是,提供的这些问题的答案似乎都不符合我的需要 我有一个由python脚本生成的头文件(key_info.h)。聪明的是,我用一行代码控制了标题的占位符版本(key_info.h):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脚本来
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目标。如果你不能得到或不想要一个
。。。任何IDE都可以配置构建配方,对吗 ,一开始我没有找到它:将生成的头放在一个.gitignoredmake
目录中,让编译器首先搜索,并保留默认值作为备份generated headers
- 如果您的构建过程不符合这一要求,那么下一个最好的方法就是,因为它对临时签出没有该文件的分支非常有效。tl;过滤器上的dr是“保留现有内容”: 注意:,所以给出一个文件 一个被跟踪的属性将起作用,它将不会对其他人产生影响,直到他们想要它
- 其次是规范方法,这是最容易实现的方法,只要文件在所有分支上都被跟踪,它就可以正常工作:
但是,当您临时切换到不跟踪该文件的分支时,它将在返回时失去这种保护git update-index --assume-unchanged key_info.h
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