我在名为XXX的文件夹中有一个Git存储库,还有第二个名为YYY的 Git存储库。 git
我想将XXX存储库做为名为ZZZ的子目录导入YYY存储库,并将全部XXX的更改历史记录添加到YYY 。 fetch
以前的文件夹结构: 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
我只想从其余存储库(XXX)导入一些文件。 子树对我来讲太复杂了,其余解决方案都行不通。 这是我所作的: 开发
ALL_COMMITS=$(git log --reverse --pretty=format:%H -- ZZZ | tr '\n' ' ')
这为您提供了一个空格分隔的全部提交列表,这些列表以相反的顺序影响了我要导入的文件(ZZZ)(您可能还必须添加--follow才能捕获重命名)。 而后,我进入目标存储库(YYY),将另外一个存储库(XXX)添加为远程存储,从中进行了获取,最后: rem
git cherry-pick $ALL_COMMITS
它将全部提交添加到您的分支中,所以您将拥有全部文件及其历史记录,而且能够对它们执行任何操做,就像它们一直在此存储库中同样。 get
我认为您可使用“ 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)
我不知道这样作的简单方法。 您能够这样作:
若是听起来很吸引人,我能够详细编辑。
在Git仓库自己中有一个众所周知的实例,在Git社区中被统称为“ 有史以来最酷的合并 ”(在发给Git邮件列表的电子邮件中使用的主题行Linus Torvalds以后,它描述了这一点)。合并)。 在这种状况下, gitk
Git GUI如今是Git的一部分,实际上曾经是一个单独的项目。 Linus设法经过如下方式将该存储库合并到Git存储库中:
git pull
版。 该电子邮件包含重现所需的步骤,但这不是为了令人胆怯:首先,利纳斯( Linus) 撰写了吉特( Git),因此他可能比您或我对这件事了解的更多,其次,这是将近5年前和Git,从那时起至关大的改进,因此也许如今是很容易。
特别是,我想如今在这种状况下,会使用gitk子模块。
可能最简单的方法是将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添加了下面答案中提到的子树合并。 我今天可能会使用该方法,尽管这种方法固然仍然可使用。