Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
分割文件时保留git历史记录_Git_History_Git Svn - Fatal编程技术网

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

分割文件时保留git历史记录,git,history,git-svn,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 bull b.php我只看到它将责任归咎于这个新的提交。也许前面的SO问题可以提供一些信息: 解释一下公认的答案:本质上,Git并不“存储”移动的代

我想从一个文件中取出一个函数并将其放入另一个文件中,但保留历史记录

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 bull b.php
我只看到它将责任归咎于这个新的提交。

也许前面的SO问题可以提供一些信息:


解释一下公认的答案:本质上,Git并不“存储”移动的代码;当为移动的代码生成诸如责备之类的事情时,这是事后通过检查整个存储库从提交到提交的状态来完成的。

尝试
git-gull-C-C b.php
维护责备历史记录的一般规则是在任何编辑之前先进行单独的移动提交。根据我的经验,这允许
git
在不需要
-C
选项的情况下工作。因此,在将文件拆分为新文件的情况下,可以通过两次提交完成:

  • 将原件复制到新的目的地,确保删除原件
  • 从复制的文件中删除额外的部分
  • 在提供的示例中,这将是:

    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
    
    我稍微修改了一下,创建了一个可重用的、非交互式的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"
    

    它只是将源文件复制到一个新文件中,并且两个文件具有相同的历史记录。我想让历史真正地归咎于老一代。我们使用git svn,所以其他人将使用svn。太糟糕了。SVN根本不支持这个!非常有帮助,德克萨斯州。。没有找到git日志的解决方案是的这个答案听起来像是“不”,但实际上是“有时”。删除似乎触发git查看一个文件的历史,而不是其他文件的出生日期。拆分一个函数,但将文件的其余部分保留为OP可能不起作用。但我只是把一个文件一分为二,删除了原来的文件并给它起了两个新的名字,这两个新文件中的错误都被正确地分配了。在提交之后,它显然失去了一个新文件的责任。仍然可能是“可能?”Potatoswatter尝试将每个文件拆分为一个单独的分支,然后将这些分支合并为一个分支。我认为这应该让git能够识别“多拷贝”。在Git1.9前后,
    git add
    对不存在的文件的行为发生了变化。您需要
    git-rm
    git-add-A
    来反映删除的文件。感谢@DamianYerrick的评论。我不认为这两种方式都有关系,如果你指定了确切的文件,但阶段。(变化是,从git 2.0开始,“
    git add
    git add-A
    ”相同,因为它包括根据不同的规则进行的删除)。