【问题标题】:git bundle: two-way all branches sync between local and remote repogit bundle:本地和远程仓库之间的双向所有分支同步
【发布时间】:2016-06-29 11:16:28
【问题描述】:

机器 A 有 Internet 连接,而机器 B 没有。两者都有本地存储库,机器 A 可以与 Github 交互。开发在两台机器上进行。 git-bundle 用于使存储库保持同步。

通常的同步流程:

  1. 创建 B 中所有分支的 bundle,并将该 bundle 转移到 A。

  2. 在 A 上克隆 github 存储库。将所有分支从 bundle 拉到从 github 克隆的存储库中。将更新后的仓库(所有分支)推送到 github。

  3. 从 github 存储库创建所有分支的捆绑包。将 bundle 转移到 B。将 bundle 中的所有分支拉到 B 上的存储库中。

有一种方法可以创建存储库所有分支的捆绑包。但是有没有办法一次将包的所有分支拉到本地存储库中?

在单分支存储库的情况下,双向同步似乎很简单。

【问题讨论】:

  • B 是否可以通过网络访问 A,还是完全独立的网络?
  • 如果 Vampire 的问题的答案是肯定的,那么您可以在 A 和 B 之间直接推拉,而无需互联网。否则我猜你正在使用闪存驱动器或物理媒体来传输捆绑包?
  • @Vampire:B 号是一座孤岛。
  • @JeffPuckettII:我正在使用闪存驱动器传输捆绑包。
  • @subba 那么 Enrico Campidoglio 的答案应该是正确的。

标签: git github git-bundle


【解决方案1】:

由于bundle 就像任何其他存储库一样——唯一的区别是捆绑包恰好存储为单个文件——您可以使用git pull --all获取来自将它们捆绑并合并到它们相应的跟踪分支中:

git pull --all /path/to/bundle

但请注意,--all 选项仅适用于 git fetch。这意味着只有当前的本地分支(即HEAD 引用的分支)将被更新。如果您还想更新所有本地分支,则必须自己编写脚本或使用git-up 之类的东西。

【讨论】:

  • 这个答案不正确;给定的命令产生fatal: fetch --all does not take a repository argument
  • 注意:我没有输入错误的命令。 Git 的错误消息似乎确实是错误的 - 我们发出 pull --all 并且错误消息说 fetch --all 不占用存储库。我正在使用 git 版本 2.23.0.windows.1。
【解决方案2】:

将以下 pullbundlebranches git 别名添加到您的 ~/.gitconfig,然后运行 ​​git pullbundlebranches ../[filename].gitbundle

[alias]
  pullbundlebranches = "!f() { git pull --tags $1; git fetch $1; git bundle verify $1 | grep ' refs/heads/' | (while read line; do \
    commit=`echo $line | cut -d' ' -f1`; branch=`echo $line | sed 's_[^\\ ]*\\ refs/heads/__'`; \
    if git show-ref -q --heads $branch; then \
      old_commit=`git rev-parse $branch`; \
      if [ \"$old_commit\" = \"$commit\" ]; then \
        echo 'Skipping' $branch 'which is up-to-date at' $old_commit; \
      elif git merge-base --is-ancestor $branch $commit; then \
        current_branch=`git rev-parse --abbrev-ref HEAD`; \
        if [ \"$current_branch\" = \"$branch\" ]; then \
          git reset --hard $commit; \
        else \
          git branch -Dq $branch; git branch $branch $commit; \
        fi; \
        echo 'Updated' $branch 'from' $old_commit 'to' $commit; \
      elif git merge-base --is-ancestor $commit $branch; then \
        echo 'Skipping' $branch 'which is ahead of bundle version ('$commit')'; \
      else \
        echo 'Error:' $branch 'already exists and diverges from upstream found in bundle'; \
        echo 'You could switch to the bundle version as follows, but you might lose work.'; \
        echo 'git checkout -B' $branch $commit; \
      fi; \
    else \
      git branch $branch $commit; \
      echo 'Created' $branch 'pointing at' $commit; \
    fi; done); }; f"

它从包中获取,然后尝试更新/创建其中包含的每个分支。如果您自己的分支版本领先或相等,则什么也不做。如果该分支与捆绑包中的版本不同,则会打印一条错误说明如何切换到捆绑包版本,并且什么也不做。

运行示例,然后强制分支到捆绑包中的版本,然后再次重新运行,但什么都不做:

$ git pullbundlebranches ../../bundles/Jabberwocky_November_snapshot.gitbundle
From ../../bundles/Jabberwocky_November_snapshot.gitbundle
 * branch              HEAD       -> FETCH_HEAD
../../bundles/Jabberwocky_November_snapshot.gitbundle is okay
Error: develop already exists and diverges from upstream found in bundle
You could switch to the bundle version as follows, but you might lose work.
git checkout -B develop 6c5214a7bd9b10d5f9e49ab9eadaa1533867ebb7
Created feature/all_glory_to_him pointing at 645152be25e0e5d3eb80615c9173e88714b23ade
Created feature/praise_the_lord pointing at 6c5214a7bd9b10d5f9e49ab9eadaa1533867ebb7
Created feature/why_are_you_reading_the_branch_names pointing at a55f5f74d6b129d173770e91c5a0ffe8ff981e8e

$ git checkout -B develop 6c5214a7bd9b10d5f9e49ab9eadaa1533867ebb7
Reset branch 'develop'
Your branch is up to date with 'origin/develop'.

$ git pullbundlebranches ../../bundles/Jabberwocky_November_snapshot.gitbundle
From ../../bundles/Jabberwocky_November_snapshot.gitbundle
 * branch              HEAD       -> FETCH_HEAD
../../bundles/Jabberwocky_November_snapshot.gitbundle is okay
Skipping develop which is up-to-date at 6c5214a7bd9b10d5f9e49ab9eadaa1533867ebb7
Skipping feature/all_glory_to_him which is up-to-date at 645152be25e0e5d3eb80615c9173e88714b23ade
Skipping feature/praise_the_lord which is up-to-date at 6c5214a7bd9b10d5f9e49ab9eadaa1533867ebb7
Skipping feature/why_are_you_reading_the_branch_names which is up-to-date at a55f5f74d6b129d173770e91c5a0ffe8ff981e8e

【讨论】:

    猜你喜欢
    • 2012-01-05
    • 2019-02-16
    • 2022-11-19
    • 1970-01-01
    • 2016-01-17
    • 2013-06-09
    • 2011-04-23
    • 2021-04-07
    • 2021-11-02
    相关资源
    最近更新 更多