Git 从以前的修订版开始应用自动文件转换(转换),保留历史记录
对于一个给定的项目(我目前专门从事该项目),我希望对一些文件应用某种自动转换。在本次讨论中,假设我希望将所有文本文件的行尾从Windows样式更改为Unix样式。我希望新的格式在过去的某次修订中有效,并贯穿历史 我通常做的是:我启动一个交互式重基,并在每次提交后从所需的起点附加以下内容:Git 从以前的修订版开始应用自动文件转换(转换),保留历史记录,git,git-rebase,file-conversion,Git,Git Rebase,File Conversion,对于一个给定的项目(我目前专门从事该项目),我希望对一些文件应用某种自动转换。在本次讨论中,假设我希望将所有文本文件的行尾从Windows样式更改为Unix样式。我希望新的格式在过去的某次修订中有效,并贯穿历史 我通常做的是:我启动一个交互式重基,并在每次提交后从所需的起点附加以下内容: exec <transformation rule> exec git commit -m "transform" && git revert --no-edit HEAD exe
exec <transformation rule>
exec git commit -m "transform" && git revert --no-edit HEAD
exec
exec git commit-m“transform”和&git revert——无编辑头
这将导致一个转换
,然后是一系列原始提交,每个提交都被还原
和转换
包围,然后是最终的还原
。然后,我执行第二个交互式重基并挤压所有三元组revert
---transform
,并删除最后一个revert
。第一个变换
保持原位,所有其他变换
和还原
提交消失
这个手动过程产生(几乎)所需的结果(我不确定新提交的提交日期),但我想知道是否可以使用过滤器分支实现自动化,快速导入
或者可能是我在粗略搜索中错过的自定义工具。在这种情况下,您可能需要的是过滤器分支
用更多的解释来更新:当你执行上面描述的源代码时(当我仔细阅读它的时候,我真的希望为你的独创性喝彩!),你必须考虑一系列给定的变化,一系列的变化,转变。这就是为什么你必须引入一个假回复,你必须在下一个互动中挤压它。因此,你避免了冲突,这让我非常着迷
与此不同,git filter branch在同一提交序列上提供了另一个“视图”。序列中的每个提交都被视为状态,而不是转换。您提供的过滤器会更改状态本身。因此,你根本不必考虑冲突,它们根本不可能出现。但当然,您必须对序列中的每个提交应用相同的转换
因此,您的特定问题的答案是:如果您希望将新行从DOS转换为UNIX,只需运行如下命令:
git筛选器分支--树筛选器“查找”-键入f-print0 | xargs-0 perl-pi-e“s\r\n\n,;”'HEAD
perl-pi-e的\n\r\n;'
是执行转换的命令,find
和xargs
是收集当前目录中所有文件并将其传递给perl
的方法。请注意,git
有自己的CRLF魔法(参见core.autocrlf
、core.safecrlf
和.gittributes
文件的man-git-config
),通常不需要手动处理CRLF,正确的配置足以构建一个适用于Windows和类unix系统的存储库。您建议使用哪种特定的--filter-
呢?刚刚有机会测试了filter branch
。它摇晃。谢谢你给我指出了看似显而易见的问题。