钩住或不钩住



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

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

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

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

带有msysgit 1.7.4 的Windows XP

--=更新=--

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

echo "*.xrp    filter=xrp" > .git/info/attributes
git config --global filter.xrp.clean 'tr -cd '''11121540-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 '''11121540-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文件中
  • 应进行版本控制并分发给其他存储库的属性(即所有用户感兴趣的属性)应进入.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是否有机会按原样处理它们(即它们只包含少数奇怪的字节,但在其他方面是文本)?如果是这样,您可以使用.gitattributes强制git将它们视为文本。如果没有,最好还是创建自定义的diff和合并脚本(根据需要使用tr进行转换),并告诉git使用它,再次使用.gitattributes

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

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

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

与其看挂钩,不如看git help attributes,尤其是difftextconv,它们允许您配置与某些模式匹配的文件,以使用其他困难方法。您应该能够生成可工作的ASCII diff,而不必牺牲存储或编辑文件的方式。

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

相关内容

  • 没有找到相关文章

最新更新