如何将一些文件从一个 git repo 移动到另一个(不是克隆),保留历史记录 [英] How to move some files from one git repo to another (not a clone), preserving history

查看:34
本文介绍了如何将一些文件从一个 git repo 移动到另一个(不是克隆),保留历史记录的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们的 Git 存储库最初是作为单个怪物 SVN 存储库的一部分,其中每个项目都有自己的树,如下所示:

Our Git repositories started out as parts of a single monster SVN repository where the individual projects each had their own tree like so:

project1/branches
        /tags
        /trunk
project2/branches
        /tags
        /trunk

显然,使用 svn mv 将文件从一个移动到另一个非常容易.但是在 Git 中,每个项目都在自己的存储库中,今天我被要求将子目录从 project2 移动到 project1.我做了这样的事情:

Obviously, it was pretty easy to move files from one to another with svn mv. But in Git, each project is in its own repository, and today I was asked to move a subdirectory from project2 to project1. I did something like this:

$ git clone project2 
$ cd project2
$ git filter-branch --subdirectory-filter deeply/buried/java/source/directory/A -- --all
$ git remote rm origin  # so I don't accidentally overwrite the repo ;-)
$ mkdir -p deeply/buried/different/java/source/directory/B
$ for f in *.java; do 
>  git mv $f deeply/buried/different/java/source/directory/B
>  done
$ git commit -m "moved files to new subdirectory"
$ cd ..
$
$ git clone project1
$ cd project1
$ git remote add p2 ../project2
$ git fetch p2
$ git branch p2 remotes/p2/master
$ git merge p2 # --allow-unrelated-histories for git 2.9+
$ git remote rm p2
$ git push

但这似乎很复杂.一般来说,有没有更好的方法来做这种事情?还是我采用了正确的方法?

But that seems pretty convoluted. Is there a better way to do this sort of thing in general? Or have I adopted the right approach?

请注意,这涉及将历史记录合并到现有存储库中,而不是简单地从另一个存储库的一部分创建一个新的独立存储库 (如之前的问题).

Note that this involves merging the history into an existing repository, rather than simply creating a new standalone repository from part of another one (as in an earlier question).

推荐答案

是的,点击 filter-branch--subdirectory-filter 是关键.您使用它的事实本质上证明没有更简单的方法 - 您别无选择,只能重写历史记录,因为您只想得到文件的(重命名)子集​​,而这根据定义会更改散列.由于没有任何标准命令(例如 pull)重写历史记录,因此您无法使用它们来完成此操作.

Yep, hitting on the --subdirectory-filter of filter-branch was key. The fact that you used it essentially proves there's no easier way - you had no choice but to rewrite history, since you wanted to end up with only a (renamed) subset of the files, and this by definition changes the hashes. Since none of the standard commands (e.g. pull) rewrite history, there's no way you could use them to accomplish this.

当然,您可以改进细节 - 您的某些克隆和分支并不是绝对必要的 - 但整体方法很好!很遗憾它很复杂,但当然,git 的重点不是让重写历史变得容易.

You could refine the details, of course - some of your cloning and branching wasn't strictly necessary - but the overall approach is good! It's a shame it's complicated, but of course, the point of git isn't to make it easy to rewrite history.

这篇关于如何将一些文件从一个 git repo 移动到另一个(不是克隆),保留历史记录的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆