将Git存储库内容移动到另一个存储历史记录


141

我正在尝试使用以下命令将一个存储库(repo1)的内容仅移动到另一个现有存储库(repo2):

git clone repo1
git clone repo2
cd repo1
git remote rm origin
git remote add repo1
git push

但这不起作用。我查看了类似的帖子,但只找到一个移动文件夹,而不移动内容。


您是否想将repo1的内容作为repo2上的一个分支或作为master的一部分,以便将两个repos的文件夹共存于您的工作目录中?
2013年

我想将它作为主人的一部分移动。
Mario

4
本教程非常完美!smashingmagazine.com/2014/05/19/...
xpto

Answers:


242

我认为您正在寻找的命令是:

cd repo2
git checkout master
git remote add r1remote **url-of-repo1**
git fetch r1remote
git merge r1remote/master --allow-unrelated-histories
git remote rm r1remote

之后,repo2/master将包含repo2/master和中的所有内容,并且还将包含repo1/master它们的历史。


感谢Chronial,我只想确保repo1也有一个分支,如果我也想将那个分支也移到repo2怎么办?
马里奥

好,repo2也有第二个分支吗?或该分支应该发生什么?
2013年

1
慢性,上述命令没有奏效!它没有复制历史。
马里奥

1
好的,现在可以了。我使用了以下命令; cd repo2,> git remote rm origin> git remote add origin url-of-repo1,> git fetch r1remote> git push origin master
Mario

1
@abhijithda最简单的解决方案是在进行合并之前将所有内容repo1移入一个子文件夹(inside repo1)。
慢性的

55

在这里完美描述https://www.smashingmagazine.com/2014/05/moving-git-repository-new-server/

首先,我们必须从现有存储库中获取所有远程分支和标签到我们的本地索引:

git fetch origin

我们可以检查创建本地副本所需的任何缺少的分支:

git branch -a

让我们使用新存储库的SSH克隆URL在现有本地存储库中创建一个新的远程服务器:

git remote add new-origin git@github.com:manakor/manascope.git

现在我们准备将所有本地分支和标签推送到名为new-origin的新远程目录中:

git push --all new-origin 
git push --tags new-origin

让我们将new-origin设为默认远程:

git remote rm origin

将new-origin重命名为just origin,以便它成为默认的remote:

git remote rename new-origin origin

4
可以确认是否复制了整个历史记录和标签。非常好。谢谢。
亚历克斯(Alex)

如果new-origin没有任何提交,则它工作良好。但是,如果在new-origin中有任何提交,则此处提到的方式将无法正常使用。
CAOT

您需要使用swtich git checkout BranchName分支,然后再次将分支推送到远程git push --all new-origin
仓库

21

如果您要保留现有分支并提交历史记录,这是对我有用的一种方法。

git clone --mirror https://github.com/account/repo.git cloned-repo
cd cloned-repo
git push --mirror {URL of new (empty) repo}

# at this point only remote cloned-repo is correct, local has auto-generated repo structure with folders such as "branches" or "refs"
cd ..
rm -rf cloned-repo
git clone {URL of new (empty) repo}
# only now will you see the expected user-generated contents in local cloned-repo folder

# note: all non-master branches are avaialable, but git branch will not show them until you git checkout each of them
# to automatically checkout all remote branches use this loop:
for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done

现在,假设您要在一段时间内使源和目标存储库保持同步。例如,您要转移到新仓库/替换仓库中的当前远程仓库中仍存在活动。

git clone -o old https://github.com/account/repo.git my-repo
cd my-repo
git remote add new {URL of new repo}

要下拉最新更新(假设您没有本地更改):

git checkout {branch(es) of interest}
git pull old
git push --all new

注意:我还没有使用子模块,所以我不知道如果有子模块,可能还需要其他步骤。


1
这对我来说简单而轻松。我认为这应该是经过检查的答案。如果您有60个分支,这就是方法。
rickfoosusa

7

如果Git已经跟踪了代码,则是最简单的方法,然后将新存储库设置为要推送到的“源”。

cd existing-project
git remote set-url origin https://clone-url.git
git push -u origin --all
git push origin --tags

6

这可以将我的本地存储库(包括历史记录)移动到远程github.com存储库。在GitHub.com创建新的空仓库后,我在下面的第三步中使用了URL,它工作得很好。

git clone --mirror <url_of_old_repo>
cd <name_of_old_repo>
git remote add new-origin <url_of_new_repo>
git push new-origin --mirror

我在以下网址找到了这个:https//gist.github.com/niksumeiko/8972566


1
这是放置原始存储库的最简单方法。它还会复制所有分支。
吉列尔莫(Guillermo)

1
这也会复制所有标签。
乌鸦

2

我通过维护所有分支和提交历史记录使用以下方法将GIT Stash迁移到GitLab。

将旧存储库克隆到本地。

git clone --bare <STASH-URL>

在GitLab中创建一个空的存储库。

git push --mirror <GitLab-URL>

1

看来您接近了。假设您提交的不仅仅是错字,则应该使用步骤3 cd repo2代替repo1。第6步不应git pull推。重做清单:

1. git clone repo1
2. git clone repo2
3. cd repo2
4. git remote rm origin
5. git remote add repo1
6. git pull
7. git remote rm repo1
8. git remote add newremote

谢谢Eric,但是在第3步中,我想删除原始存储库的链接,以避免进行任何远程更改。因为我想将内容从repo1移到repo2。
Mario

好的。我已经编辑了答案以尝试反映这一点。为了确保您正在尝试创建一个存储库repo2,该存储库是repo1的副本,但是没有将repo1或原始源保留为远程数据库?
埃里克·宫

不,我不是要制作新的仓库“ repo2”。实际上,我有一个包含其他内容init的现有repo2。现在我想将所有repo1内容与历史记录一起移动到repo2中。我将把repo1保留为空,因为它在服务器中。
Mario

您是否考虑过不使用git?看来您可能只需要复制文件(通过gui或scp或ftp)并将其手动添加到git repo中即可。它可能效率不高,但可能更简单。
埃里克·宫

我已经尝试过了,但是它留下了历史。我也想移动它的所有历史。
Mario 2013年

1

根据@ Dan-Cohn的回答Mirror-push是您的朋友在这里。这是我用于迁移存储库的路径:

镜像存储库

1.打开Git Bash。

2.创建存储库的裸克隆。

$ git clone --bare https://github.com/exampleuser/old-repository.git

3.镜像推送到新的存储库。

$ cd old-repository.git
$ git push --mirror https://github.com/exampleuser/new-repository.git

4.删除您在步骤1中创建的临时本地存储库。

$ cd ..
$ rm -rf old-repository.git

参考和信誉:https : //help.github.com/en/articles/duplicating-a-repository


-1

这里有很多复杂的答案;但是,如果您不关心分支保留,则只需重置远程源,设置上游并推送即可。

这为我保留了所有提交历史。

cd <location of local repo.>
git remote set-url origin <url>
git push -u origin master
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.