挂钩或不挂钩 - git

时间:2011-06-29 07:33:03

标签: git hook tr gitattributes

我们的定制IDE输出XML文件,其编码使它们看起来像二进制文件。这些文件的差异和合并失败。

我们可以使用tr命令创建这些文件的ASCII版本。我想进入一种状态,在这些文件提交之前总是自动转换为ascii。

我拿起了我的版本控制与Git 的副本,它全心全意警告我不要使用钩子,除非我真的需要。

我是否应该为此目的使用钩子?或者我可以做其他事情以确保在提交之前始终转换文件吗?

使用msysgit 1.7.4的Windows XP

- = update = -

感谢大家的帮助和耐心。期待this question我尝试了以下操作,但它不起作用:

echo "*.xrp    filter=xrp" > .git/info/attributes
git config --global filter.xrp.clean 'tr -cd '\''\11\12\15\40-\176'\'''
git config --global filter.xrp.smudge cat
git checkout --force

此配置更改后文件保持不变。即使我删除并重新结账。

配置为清理任务tr命令单独工作。证明:

$ head -n 1 cashflow/repo/C_GMM_CashflowRepo.xrp
ÿþ< ! - -   X M L   R e p o s i t o r y   f i l e   1 . 0   - - >

$ tr -cd '\''\11\12\15\40-\176'\' < cashflow/repo/C_GMM_CashflowRepo.xrp | head -n 1
<!-- XML Repository file 1.0 -->

任何人都可以看到我的配置有什么问题吗?

3 个答案:

答案 0 :(得分:5)

钩子的一个问题是它们不是分布式的。

.gitattributes有一些指令来管理文件的差异和内容,但另一个选项是 attribute filter (仍然在.gitattributes),以及可以在提交时自动转换这些文件 (即如果干净的脚本能够detect those files based on their content alone


根据此聊天讨论,OP Synesso报告成功:

.gitattributes:
*.xrp filter=xrp

~/.gitconfig:
[filter "xrp"]
clean = \"C:/Program Files/Git/bin/tr.exe\" -cd "\\''\\11\\12\\15\\40-\\176'\\'"
smudge = cat
  

然后我不得不修改文件,添加,提交,删除,结帐......然后修复了。 :)

请注意,对于任何不仅涉及一个用户的修改,但可能是任何克隆该repo的用户,我更喜欢添加(并提交)声明过滤器的额外.gitattributes文件,而不是修改.git/info/attribute文件(未克隆)。

来自gitattributes man page

  
      
  • 如果您希望仅影响单个存储库(即,将属性分配给特定于该存储库的一个用户工作流的文件),则应将属性放在$GIT_DIR/info/attributes文件中。
  •   
  • 应该受版本控制并分发到其他存储库的属性(即所有用户感兴趣的属性)应该进入.gitattributes个文件。
  •   
  • 应该影响单个用户的所有存储库的属性应放在core.attributesfile配置选项指定的文件中。
  •   
  • 系统上所有用户的属性应放在$(前缀)/ etc / gitattributes文件中。
  •   

http://git-scm.com/docs/gitattributes


phyatt添加in the comments

  

我为sqlite3做了一个类似的例子。
  您可以使用两行将其添加到正确的文件中:

git config diff.sqlite3.textconv 'sqlite3 $1 .dump'
echo '*.db diff=sqlite3' >> $(git rev-parse --show-toplevel)/.gitattributes 
  

类似的行可用于编写其他git配置路径。

答案 1 :(得分:2)

diff是否有机会按原样处理它们(即它们只包含一些奇怪的字节,但是否则是文本)或不是?如果是,您可以强制git将其视为.gitattributes的文本。如果没有,那么创建自定义差异和合并脚本(根据需要使用tr进行转换)并告诉git再次使用.gitattributes仍然可能更好。

在任何一种情况下,你都不会使用钩子(那些用于在特定操作中运行),而是.gitattributes,它们是特定于文件的。

答案 2 :(得分:2)

如果您首选的编辑格式是ASCII,并且只有您的构建需要二进制文件,我建议使用构建规则从您将提交到存储库的首选源生成二进制版本。

鉴于您的IDE已经以二进制格式生成文件,我认为最好的方法是将它们以该格式存储在存储库中。

而不是挂钩,请查看git help attributes,尤其是difftextconv,它们允许您配置与特定模式匹配的文件,以使用其他差异方法。您应该能够生成有效的ASCII差异,而不必牺牲存储文件或编辑文件的方式。

编辑:根据您在其他地方的评论,“每隔一个字节为0”表示该文件为UTF-16或UCS-2。有关可以处理unicode的diff,请参阅此答案:Can I make git recognize a UTF-16 file as text?