2011-06-29 228 views
6

我们定制的IDE输出的XML文件的编码使它们看起来像二进制文件。这些文件的区别和合并失败。挂钩或不挂钩 - git

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

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

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

的Windows XP与msysgit 1.7.4

- = =更新 -

谢谢大家对您的帮助和耐心。展望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 --> 

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

+0

失败的差异或合并清单如何?合并失败的方式是什么? – ralphtheninja

+0

差异响应:“二进制文件不同”。好问题,但我只是假设由于无法区分而导致合并失败。无论如何,有差异的能力会很好。 – Synesso

回答

5

钩子的一个问题是它们没有分布。

.gitattributes有一定的指导来管理文件的DIFF和内容,但另一种选择将是一个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 

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

需要注意的是,对于不关注只是一个用户,但潜在的任何用户克隆即回购,我更喜欢加入(并承诺)的额外.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 

类似线可用于编写其他混帐配置路径。

+0

谢谢。属性过滤器听起来同样有趣。 – Synesso

+0

我发现属性过滤器最有用。我最终得到这个问题:http://stackoverflow.com/questions/2316677/can-git-automatically-switch-between-spaces-and-tabs/2318063#2318063 - 我试图解决方案,但它不工作。问题已更新。 – Synesso

+0

@Synesso:您是否尝试在其他地方再次签出所有存储库? – VonC

2

差异是否存在对它们进行处理的机会(即它们只包含少量奇怪的字节,否则为文本)?如果是这样,你可以强制git将它们作为文本与.gitattributes。如果不是,那么创建自定义差异和合并脚本(这将使用tr来根据需要进行转换)仍然可能会更好,并告诉git使用它,再次使用.gitattributes

在这两种情况下,您都不会使用挂钩(这些挂钩用于在特定操作中运行),但是.gitattributes是文件特定的。

+0

这些文件是XML文件,但是当我在hexdump中查看它们时,每个字节都与00交错。结果它们被视为差异二进制文件。你的解决方案听起来很简单我明天会试一试。 – Synesso

2

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

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

而不是钩子,看看git help attributes,特别是difftextconv,它允许您配置匹配某些模式的文件,以使用替代的差异手段。您应该能够生成有效的ASCII区别,而不必妥协存储文件或编辑它们的方式。

编辑:根据您在其他地方的评论,“每隔一个字节为0”,建议该文件是UTF-16或UCS-2。看到这个答案为diff它可以处理unicode:Can I make git recognize a UTF-16 file as text?

+0

谢谢。我应该明确指出,IDE是一个水果蛋糕,当它们确实没有时,它们将这些文件写成二进制文件。他们的二进制没有任何好处。感谢您的有益答案! – Synesso

+0

+1用于按需生成XML文件,并仅提交生成XML的源文档。 –

+0

@Synesso根据你的评论我添加了一个相关问题的链接。 –