如何将现有的Git存储库导入另外一个?

我在名为XXX的文件夹中有一个Git存储库,还有第二个名为YYY的 Git存储库。 git

我想将XXX存储库做为名为ZZZ的子目录导入YYY存储库,并将全部XXX的更改历史记录添加到YYYfetch

以前的文件夹结构: spa

├── XXX
│   ├── .git
│   └── (project files)
└── YYY
    ├── .git
    └── (project files)

文件夹结构以下: code

YYY
├── .git  <-- This now contains the change history from XXX
├──  ZZZ  <-- This was originally XXX
│    └── (project files)
└──  (project files)

能够作到这一点,仍是必须使用子模块? orm


#1楼

我只想从其余存储库(XXX)导入一些文件。 子树对我来讲太复杂了,其余解决方案都行不通。 这是我所作的: 开发

ALL_COMMITS=$(git log --reverse --pretty=format:%H -- ZZZ | tr '\n' ' ')

这为您提供了一个空格分隔的全部提交列表,这些列表以相反的顺序影响了我要导入的文件(ZZZ)(您可能还必须添加--follow才能捕获重命名)。 而后,我进入目标存储库(YYY),将另外一个存储库(XXX)添加为远程存储,从中进行了获取,最后: rem

git cherry-pick $ALL_COMMITS

它将全部提交添加到您的分支中,所以您将拥有全部文件及其历史记录,而且能够对它们执行任何操做,就像它们一直在此存储库中同样。 get


#2楼

我认为您可使用“ git mv”和“ git pull”来作到这一点。 it

我是一个不错的git noob-请注意您的主存储库-但我只是在temp目录中尝试了此操做,它彷佛有效。 io

首先-重命名XXX的结构以匹配它在YYY内时的外观:

cd XXX
mkdir tmp
git mv ZZZ tmp/ZZZ
git mv tmp ZZZ

如今XXX看起来像这样:

XXX
 |- ZZZ
     |- ZZZ

如今使用“ git pull”来获取更改:

cd ../YYY
git pull ../XXX

如今YYY看起来像这样:

YYY
 |- ZZZ
     |- ZZZ
 |- (other folders that already were in YYY)

#3楼

我不知道这样作的简单方法。 您能够这样作:

  1. 使用git filter-branch在XXX存储库上添加ZZZ超级目录
  2. 将新分支推送到YYY存储库
  3. 将推入的分支与YYY的树干合并。

若是听起来很吸引人,我能够详细编辑。


#4楼

在Git仓库自己中有一个众所周知的实例,在Git社区中被统称为“ 有史以来最酷的合并 ”(在发给Git邮件列表的电子邮件中使用的主题行Linus Torvalds以后,它描述了这一点)。合并)。 在这种状况下, gitk Git GUI如今是Git的一部分,实际上曾经是一个单独的项目。 Linus设法经过如下方式将该存储库合并到Git存储库中:

  • 它在Git存储库中的显示就好像它一直是做为Git的一部分开发的同样,
  • 全部的历史都保持不变
  • 它仍然能够在其旧仓库自主研发的,具备改变单纯是git pull版。

该电子邮件包含重现所需的步骤,但这不是为了令人胆怯:首先,利纳斯 Linus) 撰写了吉特 Git),因此他可能比您或我对这件事了解的更多,其次,这是将近5年前和Git,从那时起至关大的改进,因此也许如今是很容易。

特别是,我想如今在这种状况下,会使用gitk子模块。


#5楼

可能最简单的方法是将XXX内容拉入YYY中的一个分支,而后将其合并到master中:

YYY中

git remote add other /path/to/XXX
git fetch other
git checkout -b ZZZ other/master
mkdir ZZZ
git mv stuff ZZZ/stuff                      # repeat as necessary for each file/dir
git commit -m "Moved stuff to ZZZ"
git checkout master                
git merge ZZZ --allow-unrelated-histories   # should add ZZZ/ to master
git commit
git remote rm other
git branch -d ZZZ                           # to get rid of the extra branch before pushing
git push                                    # if you have a remote, that is

实际上,我只是用几个存储库尝试了一下,而且有效。 与Jörg的答案不一样,它不会让您继续使用其余回购协议,但我认为您不管如何都没有指定。

注意:因为这是最初于2009年编写的,所以git添加了下面答案中提到的子树合并。 我今天可能会使用该方法,尽管这种方法固然仍然可使用。

相关文章
相关标签/搜索