设置git来拉动并推动所有分支

Lak*_*sad 572 git version-control branch push

我想默认推送和拉出所有分支,包括新创建的分支.

我可以为它定义一个设置吗?

否则,当我在本地添加一个新分支并且我想从服务器中提取它时,最简单的方法是什么?

我创建了一个具有相同名称的新分支,并试图拉,但它不起作用.问我分支机构的所有远程配置.我该如何设置它.

bri*_*010 1223

最简单的方法是:

git push --all origin
Run Code Online (Sandbox Code Playgroud)

这将推动标签和分支.

  • 如果你添加一次`-u`,例如`git push --all origin -u`,则设置跟踪,之后你可以简单地使用`git push`. (170认同)
  • 对于git版本1.7.12.3,我不得不使用`git push --tags origin`来推送所有标签. (21认同)
  • 警告:如果你有一堆你没有清理过的LOCAL分支(功能,修补程序) - 或者没有正确清理(我),这将淹没你的遥控器.该死的.我们只是修剪了一下.不知道为什么我的当地人留下了这么多分支. (20认同)
  • 另外看看"--mirror"而不是"--all"这会推动更多东西 (15认同)
  • 在SO和其他地方找到的几十个答案中,这是推送新创建的本地分支的最简单方法,而不需要触及配置.谢谢! (10认同)
  • 它没有为我推动标签..我不得不做`git push --tags origin` (4认同)
  • @Loda - “--mirror”会做海报想要的吗?我们有一个人用“--mirror”蒸发了远程仓库上的所有分支(当他执行“--mirror”时,他只检查了master)。我怀疑有一种方法可以修复您的 refs/remote/* 但没有时间使用它并最终从备份中恢复。 (2认同)
  • @Scott“--mirror”做的事情不仅仅是推送新闻分支。它的做法有所不同。(即:强制更新,删除旧分支,...)。它的作用超出了海报所要求的范围。无论如何,根据http://stackoverflow.com/q/3333102/154272和https://www.kernel.org/pub/software/scm/git/docs/git-push.html,这可能不是最好的要走的路。 (2认同)
  • 要从 1.8.3 开始推送标签,您可以使用 `git push --all --follow-tags origin` (2认同)
  • 这不会推送 **all** 分支(如 OP 所要求的),而只会推送 **all 本地** 分支,所以对我来说这不起作用,因为我想将 **all** 分支从一个 repo 复制到另一个通过本地仓库,但只推送主(已结帐)和本地分支 (2认同)

Jak*_*ski 145

使用现代git,您总是获取所有分支(作为远程跟踪分支到refs/remotes/origin/*命名空间,用git branch -r或可见git remote show origin).

默认情况下(请参阅push.default配置变量的文档),您可以推送匹配的分支,这意味着首先您必须git push origin branch为git执行此操作以始终将其推送git push.

如果要始终推送所有分支,可以设置push refspec.假设遥控器已命名,origin您可以使用git config:

$ git config --add remote.origin.push '+refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push '+refs/tags/*:refs/tags/*'
Run Code Online (Sandbox Code Playgroud)

或直接编辑.git/config文件以具有以下内容:

[remote "origin"]
        url = user@example.com:/srv/git/repo.git
        fetch = +refs/heads/*:refs/remotes/origin/*
        fetch = +refs/tags/*:refs/tags/*
        push  = +refs/heads/*:refs/heads/*
        push  = +refs/tags/*:refs/tags/*

  • @Merc:`git push --all origin`有一次发布所有分支和标签,虽然默认为当前版本'匹配'语义意味着你之后会推送所有分支...除非你添加新的分支或标签.**设置**到*"默认推送[...]所有分支"*是写的. (3认同)
  • 自git 2.0以来,这已经发生了变化.推送默认很简单,不再匹配. (3认同)
  • 现在,“ push.default”的默认值为“ simple”。 (2认同)

小智 32

在推送规范中包含+可能是一个坏主意,因为这意味着即使没有-f,git也会愉快地执行非快进推送,如果远程服务器设置为接受这些,则可能会丢失历史记录.

试试吧:

$ git config --add remote.origin.push 'refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push 'refs/tags/*:refs/tags/*'
$ git config --add remote.origin.fetch 'refs/heads/*:refs/remotes/origin/*'
$ git config --add remote.origin.fetch 'refs/tags/*:refs/tags/*'
Run Code Online (Sandbox Code Playgroud)


vik*_*027 19

我曾使用以下命令将所有分支迁移到新存储库.

~$ 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 master
~$ git push new-origin --mirror
Run Code Online (Sandbox Code Playgroud)

注意:在将Atlassian Stash的repo克隆到AWS CodeCommit(空白回购)时,我必须使用倒数第二个(即首先推送主控)命令.我不确定原因,但是在推(git push new-origin --mirror)默认分支后指的是其他一些分支master.

  • 这确实是唯一有用的方法。使用`git push new_origin --all`只是将您当前的本地分支推送到new_origin,而不是所有原始分支。 (2认同)

Lan*_*and 11

如果您要将分支机构移动到旧的仓库并且没有所有旧的仓库分支本地,则需要先跟踪它们.

for remote in `git branch -r | grep -v '\->'`; do git branch --track $remote; done
Run Code Online (Sandbox Code Playgroud)

然后添加新的远程仓库:

git remote add bb <path-to-new-repo>
Run Code Online (Sandbox Code Playgroud)

然后你可以使用这个命令全部推送:

git push -u bb --all
Run Code Online (Sandbox Code Playgroud)

或者您可以使用此处其他响应中提到的git config命令配置repo,如果您没有这样做或只想移动本地分支.

重要的是,其他响应只会推动所有LOCAL分支.如果分支仅存在于备用REMOTE存储库中,则它们将在不先跟踪它们的情况下移动.这里介绍的for循环将有助于此.

  • 那对我没用。最终所有远程分支都跟踪同一本地分支:/ (2认同)
  • 根据@jhsowter的评论,AFAIK不应该起作用.我在新克隆的回购中跟踪远程分支的正确命令是`git branch --track reponame origin/reponame`否则你将获得当前本地分支上跟踪的所有远程分支 (2认同)

小智 8

我在这里找到了最好和最简单的方法,就像 @kumarahul 发布的那样,对我来说就像一个魅力,它将所有标签和分支从原点推送到新的远程:

git remote add newremote new-remote-url

git push newremote --tags refs/remotes/origin/*:refs/heads/*
Run Code Online (Sandbox Code Playgroud)

我使用了“git push --all -u newremote”,但它只将签出的分支推送到 newremote。

Git:将所有分支推送到新的远程

作者:Keith Dechant,软件架构师

以下是一些人可能在使用 Git 存储库时遇到过的场景。您有一个 Git 存储库的工作副本,例如来自旧服务器的副本。但您只有工作副本,并且无法访问源。所以你不能只是分叉它。但是您想将整个存储库和所有分支历史记录推送到新的远程。

如果您的工作副本包含来自旧远程的跟踪分支(origin/branch1、origin/branch1 等),则这是可能的。如果这样做,您将拥有整个存储库和历史记录。

然而,就我而言,有几十个分支机构,其中一些或全部我从未在当地查看过。推动他们所有人似乎是一个沉重的负担。那么,如何进行呢?

我确定了两个选择:

选项 1:检查每个分支并推送 我可以做到这一点,我什至可以编写一个 Bash 脚本来提供帮助。但是,这样做会在每次签出时更改我的工作文件,并且会为每个远程跟踪分支创建一个本地分支。对于大型仓库来说,这会很慢。

选项 2:推送而不更改工作副本 还有第二种选择,它不需要签出每个分支,不会在工作副本中创建无关的分支,甚至不会修改工作副本中的文件。

如果您的旧的、不再活动的遥控器称为“oldremote”,而您的新遥控器称为“newremote”,则可以使用以下命令仅推送远程跟踪分支:

git push newremote refs/remotes/oldremote/*:refs/heads/*

在某些情况下,也可以仅推送分支的子集。如果分支名称以斜杠命名(例如oldremote/features/branch3、oldremote/features/branch4等),则只能推送名称以“oldremote/features”开头的远程跟踪分支:

git push newremote refs/remotes/oldremote/features/*:refs/heads/features/*

无论您推送所有分支还是仅推送其中部分分支,Git 都将执行整个操作,而无需创建任何新的本地分支,也无需更改您的工作文件。每个与您的模式匹配的跟踪分支都将被推送到新的远程。

有关该主题的更多信息,请查看 Stack Overflow 上的此主题。

发布日期:2017 年 10 月 9 日


tok*_*khi 5

要查看所有分支,git branch -a请执行:

for remote in `git branch -r`; do git branch --track $remote; done
git fetch --all
git pull --all
Run Code Online (Sandbox Code Playgroud)

现在你可以看到所有的分支:

git branch
Run Code Online (Sandbox Code Playgroud)

推动所有分支尝试:

git push --all
Run Code Online (Sandbox Code Playgroud)


abu*_*lka 5

如果您要将所有分支从旧仓库移动到新仓库,那么在本地仓库中,您需要在推送到新仓库之前设置每个分支到现有原始分支的跟踪,否则所有原始分支都不会出现在新的起源。通过跟踪或检查每个分支手动执行此操作,或使用一个班轮:

for remote in `git branch -r | grep -v '\->' | grep -v master`; do git branch --track `echo $remote|sed 's=origin/=='` `echo $remote`; done
Run Code Online (Sandbox Code Playgroud)

这个单行命令基于本页其他答案中的版本,但可以说更好,因为:

  1. 它正确设置了分支跟踪,这与此页面上此命令的一些旧变体不同,后者仅向 --track 提供一个参数,因此每个分支最终都会跟踪 master - 不好
  2. 命名本地分支时不带前缀“origin/”,这是我个人不想要的 - 并且与您正常结帐分支时发生的情况一致。
  3. 跳过跟踪大师,因为这已经发生了
  4. 实际上不结帐任何东西因此很快
  5. 避免在 git branch -r 的输出中绊倒 ->

接下来,如果您要切换原点,请替换旧原点的链接并指向新的遥控器。确保首先使用 bitbucket/github GUI 创建新的远程,但不要向其中添加任何文件,否则会出现合并问题。例如

git remote set-url origin git@bitbucket.org:YOUR/SOMEREPO.git
Run Code Online (Sandbox Code Playgroud)

现在推。请注意,还需要第二个命令来推送标签:

git push -u --all origin
git push --tags origin
Run Code Online (Sandbox Code Playgroud)