是否有一个简单的解决方案,用于将不同的软件分支导入新的git存储库?

时间:2012-04-16 16:50:04

标签: git branch

一点背景。我在工作的实验室里有一堆自制软件。许多项目来自同一来源,但没有版本历史。在某些时候,他们中的一些人被分叉用于不同的实验目的。我们正在将所有软件放入git存储库中。希望这将使我们能够在未来合并不同的版本。

因此我必须为project1 versionA创建一个新的git存储库并调用该master分支。

然后我希望project1 versionB成为同一个git存储库的一个分支。

虽然我没有找到合适的解决方案。到目前为止,我最好的想法是:

git init(在project1 versionA中)目录,然后提交并推送到远程存储库。 然后将它拉到versionB所在的同一台计算机上的新空文件夹中。 然后我检查一个名为versionB的新分支,然后在版本A的顶部复制该版本的所有内容。然后提交-a并推送。

那应该给我两个版本/分支在git中。一个叫master(versionA),一个叫versionB。除了它不是一个简洁的解决方案之外,这个问题是版本A中存在但文件B中不存在的任何文件现在都存在于两者中。这肯定会造成混乱,因为很多软件会查看某些文件夹并加载其中的所有内容,这将是一个问题。

另一个想法是在复制之前从版本B分支清除版本A的东西,这会解决问题吗?

这似乎是做一些应该相当简单(经常遇到)的迂回方式?

3 个答案:

答案 0 :(得分:2)

  

另一个想法是从版本B清除版本A的东西   复制之前的分支,这会解决问题吗?

或多或少。提交并推送主分支后,创建并checkout versionB。现在git rm .(即清空目录),复制版本B的东西,然后提交+推送。 可能为第一个版本B创建一种混乱的提交记录; OTOH它可能没有 - 但这只是“修改过的文件A”和“删除的文件A,新文件文件A”之间的区别(我以前做过这个,但我不记得这方面的结果)。

实际上:如果您改为覆盖git rm不需要的文件,而不是先将它们全部删除(除非那太繁琐),可能会更好。

答案 1 :(得分:2)

它们都是具有不同版本的'project1',并且您希望两个版本之间存在显着重叠。我这样做(这有点不标准)。假设您有两个目录,一个名为verAsrc,另一个名为verBsrc。

$ cd verAsrc
$ git init
$ git branch versionA master
$ git branch versionB master
$ git checkout versionA
$ git add
$ git commit -m 'Project 1 version A'

# now the non-standard part

$ cd verBsrc
$ ln -s verAsrc/.git .git
$ git symbolic-ref HEAD refs/heads/versionB      # change to versionB w/o touching working files
$ git add -A
$ git commit -m 'Project 1 version B'

# Now you are done with verBsrc

$ cd verAsrc
$ git symbolic-ref HEAD refs/heads/versionA

现在你在verAsrc中有一个git存储库,它在自己的分支上同时拥有版本A和B.你可以选一个。他们现在独立;但是,这是关键,你想从versionA重新定义versionB。

$ git checkout versionB
$ git rebase versionA

GIT将识别共享的所有内容,并在versionA上仅生成一个提交到versionB的提交。单个提交将具有A和B之间的所有差异

$ git diff versionA..versionB

应该好好去。合并你想要的东西。在verAsrc中克隆存储库。

答案 2 :(得分:1)

据我了解你这样做:

project1 repository
   versionA branch   A
   versionB branch    \--- B

基本上版本B是从版本A(我猜的主分支)分支出来的,你甚至在versionB分支中留下了versionA的文件,因为你只是“复制它”。提交A是您的第一次提交。

由于您丢失了项目历史记录并且您没有分叉的代码,我建议您从空提交中进行分支。

project1 repository
   master            M
   versionA branch   |---A
   versionB branch   \---B

提交M将是您的初始(空)提交(可能只包含.gitignore文件或其他内容),提交A只能来自VersionA的文件,提交B只能来自VersionB的文件