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

Pau*_*jan 35 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
Run Code Online (Sandbox Code Playgroud)

但如果我跑,git blame b.php我只会看到它责备这个新的提交.

vin*_*e77 23

保持责备历史的一般规则是在任何编辑之前先进行单独的移动提交.根据我的经验,这允许git blame在不需要-C选项的情况下工作.因此,在将文件拆分为新文件的情况下,可以在两个提交中完成:

  1. 将原件复制到新目的地,确保删除原件
  2. 从复制的文件中删除多余的部分

在提供的示例中,这将是:

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
Run Code Online (Sandbox Code Playgroud)


Luk*_*der 7

我稍微修改了彼得在这里对另一个问题的回答,以创建一个可重用的非交互式 shell 脚本,名为git-split.sh

#!/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"
Run Code Online (Sandbox Code Playgroud)

它只是将源文件复制到一个新文件中,并且两个文件具有相同的历史记录。可以在其他答案中看到为什么这样做的解释


Amb*_*ber 6

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

git如何跟踪源代码在文件之间移动?

用来解释接受的答案:基本上,Git实际上并不"存储"移动的代码; 当生成像移动代码的责任之类的事情时,事先通过检查从提交到提交的整个存储库的状态来完成.

  • 这个答案听起来像是“不”,但实际上是“有时”。删除似乎是触发 Git 查看文件以查找其他文件出生日期之外的历史记录的原因。像OP那样拆分一个函数但保留文件的其余部分可能行不通。但我只是将一个文件分成两半,删除原始文件并给它两个新名称,并且在两个新文件中都正确分配了责任。 (2认同)

max*_*max 5

尝试 git blame -C -C b.php