拆分文件时保留git历史记录

时间:2010-10-08 04:38:05

标签: git history git-svn

我想从一个文件中取出一个函数并将其放入另一个文件中,但要记住责备历史。

cp a.php b.php

vim b.php
# delete everything but 1 function

vim a.php
# delete the 1 function

git add a.php b.php
git commit

但是如果我运行git blame b.php我只会看到它指责这个新提交。

4 个答案:

答案 0 :(得分:17)

维护责备历史记录的一般规则是在任何编辑之前先单独执行 move 提交。根据我的经验,这使得git blame可以在不需要-C选项的情况下工作。因此,在将文件拆分为新文件的情况下,可以在两次提交中完成:

  1. 将原件复制到新目的地,确保删除原件
  2. 从重复文件中删除多余部分
  3. 在提供的示例中,这将是:

    cp a.php b.php
    mv a.php c.php
    git add a.php b.php c.php
    git commit
    vim b.php  # delete everything but 1 function
    vim c.php  # delete the 1 function
    git add b.php c.php
    git commit
    

答案 1 :(得分:6)

也许这个以前的SO问题可以提供信息:

How does git track source code moved between files?

解释接受的答案:基本上,Git实际上并不“存储”移动的代码;通过检查从提交到提交的整个存储库的状态,在生成像移动代码的责任这样的事情时,已经完成了事后

答案 2 :(得分:5)

尝试git blame -C -C b.php

答案 3 :(得分:1)

我对Peter's answer to another question here进行了一些修改,以创建一个名为git-split.sh的可重用,非交互的shell脚本:

#!/bin/sh

if [[ $# -ne 2 ]] ; then
  echo "Usage: git-split.sh original copy"
  exit 0
fi

git mv $1 $2
git commit -n -m "Split history $1 to $2"
REV=`git rev-parse HEAD`
git reset --hard HEAD^
git mv $1 temp
git commit -n -m "Split history $1 to $2"
git merge $REV
git commit -a -n -m "Split history $1 to $2"
git mv temp $1
git commit -n -m "Split history $1 to $2"

它只是将源文件复制到一个新文件中,并且两个文件都具有相同的历史记录。可以在that other answer

中看到为什么这样做的解释