[英]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
文件(未克隆)。
- 如果您希望仅影响单个存储库(即,将属性分配给特定于该存储库的一个用户工作流的文件),则应将属性放置在
$GIT_DIR/info/attributes
文件中。- 应该受版本控制并分发到其他存储库的属性(即所有用户感兴趣的属性)应该 go 到
.gitattributes
文件中。- 应该影响单个用户的所有存储库的属性应该放在由
core.attributesfile
配置选项指定的文件中。- 系统上所有用户的属性都应该放在 $(prefix)/etc/gitattributes 文件中。
http://git-scm.com/docs/gitattributes
我为 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
,尤其是diff
和textconv
,它们允许您配置匹配某些模式的文件以使用替代的差异方式。 您应该能够生成有效的 ASCII 差异,而不必影响您存储文件或编辑它们的方式。
编辑:根据您在其他地方的评论,“其他每个字节都是 0”,这表明文件是 UTF-16 或 UCS-2。 有关可以处理 unicode 的diff
,请参阅此答案: 我可以让 git 将 UTF-16 文件识别为文本吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.