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

我试图只移动一个存储库(repo1)的内容到另一个现有的存储库(repo2)使用以下命令:

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

但这并不奏效。我看过一篇类似的文章,但我只发现一个人移动了文件夹,而不是内容。

226217 次浏览

看起来你很接近了。假设这不仅仅是你提交的一个拼写错误,第3步应该是cd repo2而不是repo1。第6步应该是git pull而不是push。修改了列表:

  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

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

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/masterrepo1/master的所有内容,并且还将包含它们的历史。

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,使其成为默认远程:

git remote rename new-origin origin

这里有很多复杂的答案;但是,如果您不关心分支保存,那么您所需要做的就是重置远程源、设置上游和推送。

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

cd <location of local repo.>
git remote set-url origin <url>
git push -u origin master

如果您希望保留现有的分支并提交历史,这里有一种对我有用的方法。

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

注:我还没有使用子模块,所以我不知道如果你有他们可能需要额外的步骤。

这工作移动我的本地回购(包括历史)到我的远程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找到了这个

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

将旧的存储库克隆到本地。

git clone --bare <STASH-URL>

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

git push --mirror <GitLab-URL>

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

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

镜像存储库

根据@Dan-Cohn的回答,镜像推送是你的朋友。这是我的迁移回购:

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

我不太确定我所做的是否正确,但无论如何它都起作用了。我重命名了repo1中的repo2文件夹,并提交了更改。在我的情况下,这只是一个回购,我想合并,所以这种方法是有效的。后来,进行了一些路径更改。

我做了什么:

  1. 克隆存储库到一个文件夹
  2. cd existing-project
  3. 这里打开一个git终端
  4. git remote set-url origin <NEW_GIT_REPO>
  5. git push -u origin --all
  6. git push origin --tags

如果你正在从Github回购到另一个Github回购

我建议使用:git clone --bare <URL>而不是:git clone --mirror进行迁移,因为如果你镜像一个github回购,它将不仅克隆源代码相关的东西但也克隆剩余的拉请求和github引用,在推送时导致! [remote rejected]错误。

我谈论的是这个问题

我推荐的方法是:

  1. git clone --bare <Old Repo Url>
  2. cd <path to cloned repo>
  3. git push --mirror <New Repo Url>

成功迁移所有分支,历史和源代码到github新回购没有任何错误!

对于那些使用GitHub的人,你可以通过web UI导入另一个存储库(包括历史):

https://github.com/new/import

enter image description here

我在这里看到了很多解决方案。一个是一个快速的一行,在过去为我工作是使用-mirror选项。先进入你想要复制的repo。然后假设你有一个新的回购已经设置,使用克隆链接,这就是它。它会复制所有历史到你的新回购。

cd repoOne

git --mirror linktonewrepo.git