如何将函数声明移动到另一个文件但仍保留Git历史记录?

dot*_*hen 12 git refactoring

我正在重构一个单文件PHP脚本,以在单独的文件中声明函数和类.如何将一个代码块从一个文件移动到另一个文件,同时保留每个单独行的Git历史记录?我希望能够至少git blame使用代码.与旧版本相比也会有所帮助.

请注意,我对"解决方法"解决方案不感兴趣,这些解决方案需要--follow在代码上使用其他命令或标志(例如)来查看其"旧"历史记录,查看历史记录的人必须知道该文件需要特殊处理.我要寻找其写入必要的元数据的解决方案,使得普通的Git命令,例如blame,log,diff,和这样的"只是工作",而不呈现给他们的其他标志或参数.

我已经阅读了不少 帖子,寻找类似问题的解决方案,但没有解决git blame个别问题的问题.我认为可以解决的一个解决方案是复制文件及其整个历史记录,然后解决这个问题.但是,这个问题仍然没有令人满意的答案.

oni*_*ake 5

警告:这假定重写历史记录是可接受的.除非您知道重写历史记录的含义,否则不要使用它.

要在保持历史记录使用的同时将文件拆分为多个文件git filter-branch:

git filter-branch --tree-filter 'if [ -f original.php ]; then 
    echo part1.php part2.php part3.php | xargs -n 1 cp original.php; fi' HEAD
Run Code Online (Sandbox Code Playgroud)

然后从每个文件中删除不需要的行(只保留所需的函数和类)并提交结果!

  • 请注意,链接文档是git用户手册,直到现在我才知道它(我猜它的搜索排名很低或者其他东西)但它非常详细,看起来它真的很有用.我尽量避免"谢谢!" 评论,但我真的想强调这个链接的重要性.我在Git买了一本完整的书,这个页面仍然有一些本书没有的信息. (2认同)