6

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

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

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

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

带有 msysgit 1.7.4 的 Windows XP

--= 更新 =-

感谢大家的帮助和耐心。看着这个问题,我尝试了以下方法,但它不起作用:

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配置为 clean 任务的命令确实独立工作。证明:

$ 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 -->

谁能看到我的配置有什么问题?

4

3 回答 3

6

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

.gitattributes有一些指令来管理文件的差异和内容,但另一个选项是属性过滤器(仍在 中.gitattributes),并且可以在提交时自动转换这些文件。
(也就是说,如果干净的脚本能够根据它们的内容检测这些文件)


根据此聊天讨论,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手册页

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

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


phyatt在评论中补充道:

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

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

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

于 2011-06-29T08:03:47.137 回答
2

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

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

于 2011-06-29T07:56:53.997 回答
2

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

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

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

编辑:根据您在其他地方的评论,“其他每个字节都是 0”,这表明文件是 UTF-16 或 UCS-2。diff有关可以处理 unicode 的答案,请参阅此答案:我可以让 git 将 UTF-16 文件识别为文本吗?

于 2011-06-29T07:56:55.810 回答