繁体   English   中英

上钩还是不上钩 - git

[英]To hook or not to hook - git

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

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

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

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

Windows XP 与 msysgit 1.7.4

--= 更新 =-

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

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

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

配置为 clean 任务的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 -->

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

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

.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

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

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

gitattributes手册页

  • 如果您希望仅影响单个存储库(即,将属性分配给特定于该存储库的一个用户工作流的文件),则应将属性放置在$GIT_DIR/info/attributes文件中。
  • 应该受版本控制并分发到其他存储库的属性(即所有用户感兴趣的属性)应该 go 到.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 配置路径。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM