如何告诉 git-svn 文件不是二进制文件

How to tell git-svn that files are NOT binary

我正在使用 git-svn 将大型 SVN-repo(~28k 提交)转换为 Git。 当这个过程结束时(~ 1 1/2 周),我遇到了一些 .ps1-files 在 diffs 中被视为二进制文件。 我在 master 上提交了一个 .gitignore 文件(当然是在转换之后),告诉 git 将文件视为文本:

* -text
*.snk binary
*.ico binary
*.chm binary
and so on...

注意:-text 只是告诉它按原样处理行结尾(不将它们与 Unix 行结尾一起存储在其数据库中)

但是我只能在转换后添加 .git 属性。

.git 属性在 Git-extensions for previous commits/diffs 中不太适用,但这可能是我现在不想讨论的另一个问题。主要问题是 git.

中存储的二进制文件

我在某处读到,您可以在 .git/INFO 下存储 git 属性。我可以在转换过程之前执行此操作,但我没有再尝试过,因为转换需要一周多的时间,我想在第一次罢工时就把它做好。

所以基本上我的问题现在如下: 考虑到转换后的存储库:我可以将现有 git 存储库中的现有二进制文件转换为文本文件吗?

如果不是:我如何告诉 git-svn 在整个转换过程中使用 git 属性将哪些文件视为 text/binary?

编辑: 问题不在于转换(git 故意将文件视为二进制文件),而是文件被 'git diff' 或 Git 扩展视为二进制文件。 (见答案) 使用差异工具(例如 BeyondCompare)时,您仍然可以使用这些文件。它在历史上只是有点烦人。由于文件按原样迁移,因此转换工作完美无缺。 (即 UTF-16)

binary 属性 "macro" 是 -diff -merge -text 的 shorthand(参见 gitattributes docs)。

与影响存储库和工作副本版本之间文件的行结束转换的 text 属性相反,diffmerge 属性不影响 Git 存储文件的方式。后两个属性只影响 Git 解释 文件内容的方式(例如 Git 如何为文件创建 diff/patch)。

如果您的 .gitattributes 中没有明确的 .ps1 binary.ps1 -diffgit diff 将您的 .ps1 文件解释为二进制文件的原因可能是因为他们的编码。请注意 Git 不支持 UTF-16/UCS-2,例如

如果是这种情况,您可以创建自定义 "diff driver",将文件转换为 UTF-8(如 this answer 中所建议)。

或者,由于 Windows PowerShell 也可以处理 UTF-8 脚本文件,您可以将所有 .ps1 文件转换为 UTF-8。 (如果你想在 existing/migrated 提交中转换文件,你可以使用 git-filter-branch。)