我有一个本地Git仓库,我想推送到一个新的远程仓库(在Beanstalk上设置全新的仓库,如果这很重要)。我的本地仓库有一些分支和标签,我想保留我的所有历史记录。看起来我基本上只需要执行git push,但只上传master分支。如何推送所有内容,以便在遥控器上获得我当地仓库的完整副本?
答案 0 :(得分:750)
要推all your branches,请使用(将REMOTE替换为遥控器的名称,例如“origin”):
git push REMOTE '*:*'
git push REMOTE --all
git push REMOTE --tags
最后,我认为您可以使用以下命令在一个命令中执行此操作:
git push REMOTE --mirror
然而,除了--mirror
之外,还会推送你的遥控器,所以这可能不是你想要的。
答案 1 :(得分:126)
在像我这样的情况下,你获得了一个回购,现在正在将远程原点转换为另一个回购,一个新的空仓......
所以你有你的repo和里面的所有分支,但是你仍然需要检查那些git push --all
命令的分支来实际推送它们。
你应该在推动之前执行此操作:
for remote in `git branch -r | grep -v master `; do git checkout --track $remote ; done
其次是
git push --all
答案 2 :(得分:84)
这是对我所处的情况更好的另一种看法。它解决了你有多个遥控器的问题,想要将远程source
中的所有分支克隆到远程{{ 1}}但不必事先检查它们。
(我在Daniel的解决方案中遇到的问题是,如果我之前已经检查过它,它会拒绝从destination
遥控器检出跟踪分支,即它在推送之前不会更新我的本地分支)
source
注意: 如果您不使用直接CLI,则必须转义星号:
git push destination +refs/remotes/source/*:refs/heads/*
这会将远程git push destination +refs/remotes/source/\*:refs/heads/\*
中的所有分支推送到source
中的头分支,可能会执行非快进推送。你仍然需要单独推送标签。
答案 3 :(得分:12)
git-push
的联合帮助页值得一读。结合this website,我在.git/config
中写了以下内容:
[remote "origin"]
url = …
fetch = …
push = :
push = refs/tags/*
push = :
表示“推送任何'匹配'分支(即远程存储库中已存在并具有本地对应分支的分支)”,而push = refs/tags/*
表示“推送所有标记”。
所以现在我只需要运行git push
来推送所有匹配的分支和所有标签。
是的,这不是OP想要的(所有分支都必须已经存在于远程端),但是对于那些在搜索“如何推送分支和标签”时发现此问题的人可能会有所帮助在同一时间“。
答案 4 :(得分:8)
就我而言,有效的是。
git push origin --all
答案 5 :(得分:7)
如果目的地为空,这是我找到的最简洁的方法。切换到空文件夹,然后:
# Note the period for cwd >>>>>>>>>>>>>>>>>>>>>>>> v
git clone --bare https://your-source-repo/repo.git .
git push --mirror https://your-destination-repo/repo.git
视情况将https://...
替换为file:///your/repo
等。
答案 6 :(得分:4)
我发现上面的答案仍然有一些不清楚的东西,这会误导用户。首先,确定git push new_origin --all
和git push new_origin --mirror
无法复制所有原始分支,它只是将您当地存在的分支复制到您的new_origin。
以下是我测试的两种有用的方法:
1,复制克隆裸仓库git clone --bare origin_url
,然后输入文件夹和git push new_origin_url --mirror
。通过这种方式,您还可以使用git clone --mirror origin_url
,--bare
和--mirror
将下载一个裸仓库,不包括工作区。请参阅this
2,如果您使用git clone
拥有git仓库,这意味着您拥有裸仓库和git工作区,则可以使用git remote add new_origin new_origin_url
,然后使用git push new_origin +refs/remotes/origin/\*:refs/heads/\*
,然后使用{{ 1}}
通过这种方式,你将得到一个额外的头部分支,这没有任何意义。
答案 7 :(得分:4)
我正在从一种版本控制服务切换到另一种版本控制服务,需要克隆所有存储库,包括所有分支,标签和历史记录。
要实现上述目标,我接下来要做的是:
git push origin '*:*'
.sh脚本,用于检出到本地存储库的所有分支:
for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master `; do
git branch --track ${branch#remotes/origin/} $branch
done
答案 8 :(得分:2)
基于@Daniel回答我做了:
for remote in \`git branch | grep -v master\`
do
git push -u origin $remote
done
答案 9 :(得分:2)
推送分支和标签(但不是遥控器):
void
这相当于组合git push origin 'refs/tags/*' 'refs/heads/*'
的{{1}}和--tags
选项,git似乎不允许这样做。
答案 10 :(得分:2)
镜像存储库
创建存储库的裸克隆。
git clone --bare https://github.com/exampleuser/old-repository.git
镜像推送到新存储库。
cd old-repository.git
git push --mirror https://github.com/exampleuser/new-repository.git
删除在步骤1中创建的临时本地存储库。
cd ..
rm -rf old-repository.git
镜像包含Git Large File Storage对象的存储库
创建存储库的裸克隆。将示例用户名替换为拥有存储库的人员或组织的名称,然后将示例存储库名称替换为要复制的存储库的名称。
git clone --bare https://github.com/exampleuser/old-repository.git
导航到您刚刚克隆的存储库。
cd old-repository.git
拉入存储库的Git大文件存储对象。
git lfs fetch --all
镜像推送到新存储库。
git push --mirror https://github.com/exampleuser/new-repository.git
将存储库的Git大文件存储对象推到镜像中。
git lfs push --all https://github.com/exampleuser/new-repository.git
删除在步骤1中创建的临时本地存储库。
cd ..
rm -rf old-repository.git
以上说明来自Github帮助:https://help.github.com/articles/duplicating-a-repository/
答案 11 :(得分:2)
以下命令将推送所有分支(,包括您从未检出但存在于git repo中的分支,您可以通过git branch -a
看到它们)
git push origin '*:*'
注意:迁移版本控制时,此命令很方便 服务(即从 Gitlab 迁移到 GitHub )
答案 12 :(得分:1)
我发现这些似乎都不适合我。随意将其烧死,但由于某种原因无法让其他选项正常工作。
预期结果是“克隆”到另一个远程(即从Github到另一个提供商)的回购:
我看到的主要问题是所有远程分支都没有在新远程中重新创建。如果命令有,则新远程没有分支历史记录(即,执行git checkout branch; git log
不会显示预期的分支提交。)
我注意到git checkout -b branchname
与git checkout branchname
不同(后者是我需要的)。我注意到git checkout --track branchname
似乎没有提取分支历史记录。
我的解决方案(基于PowerShell):
Function Git-FetchRemoteBranches {
$originalbranch = (git symbolic-ref HEAD).split("/")[-1]
Foreach ($entry in (git branch -r)) {
If ($entry -like "*->*") {
$branch = $entry.split("->")[2].split("/")[1]
}
else {$branch = $entry.split("/")[1]}
Write-Host "--Trying git checkout " -NoNewline
Write-Host "$branch" -Foreground Yellow
git checkout $branch
Remove-Variable branch -Force
""}
#Switch back to original branch, if needed
If ( ((git symbolic-ref HEAD).split("/")[-1]) -ne $originalbranch) {
"Switching back to original branch"
git checkout $originalbranch
Remove-Variable originalbranch -Force
}
}
git clone http://remoterepo
cd remoterepo
Git-FetchRemoteBranches
git remote add newremote
git push newremote --all
git push newremote --tags #Not sure if neeeded, but added for good measure
答案 13 :(得分:1)
我最喜欢(也是最简单)的方式
git clone --mirror OLD_GIT_URL
cd NEW_CREATED_FOLDER
git remote add NEW-REMOTE NEW_GIT_URL
git push NEW-REMOTE --mirror
答案 14 :(得分:0)
每次我谷歌如何做这件事时,我最终都会阅读同一个线程,但它并没有让我到达我需要的地方,所以希望这对我未来的自己和其他人也有帮助。
我开始了一个新的本地项目,我想将它推送到我的存储库 (BitBucket)。这是我所做的:
git init
git add .
git commit -m "Initial commit"
new_project
git remote add origin git@bitbucket.org:AndrewFox/new_project.git
git push origin master -f
-f
标志是强制推送,否则会识别出两个 repo 不同而失败。