使用git子树合并,同时也在所有合并子树的所有分支中进行合并

2024-01-23

我想使用一个流行的开源问题跟踪器 (Redmine),它提供 git 集成。不幸的是,跟踪器中的每个项目只能与一个 git 存储库关联。在跟踪器中创建多个项目不是我的理想设置。

考虑到这一点,我尝试使用 git 子树合并(解释为here http://www.kernel.org/pub/software/scm/git/docs/howto/using-merge-subtree.html, and here http://blog.nuclearsquid.com/writings/subtree-merging-and-you)。我创建了一个“伞”存储库,它已合并到我正在使用的众多其他存储库中。

不幸的是,给出的示例仅拉入每个子树的主分支。由于我在每个子树的多个分支中进行开发,因此我需要学习如何让这个伞式存储库反映每个子树的每个分支。

这可能吗?

额外加分:如果 2 个子树各有一个同名的分支怎么办?


对于我们这些不熟悉 Redmine 的人,请扩展您的描述以包括以下问题的答案: 跟踪器需要对存储库进行何种访问?它需要自己做出承诺吗?或者,它是否只需要某些类型的读取访问(可能是为了验证提交哈希值并扫描提交日志中的关键字)?

如果您的跟踪器只需要读取访问权限,您可能根本不需要任何子树合并。在单个存储库中进行多个初始提交(允许多个独立的历史记录)是完全可以接受的。 Git 项目本身这样做是为了一些“额外的”(man, html, todo)不共享(提交)历史记录,但与源代码的主要分支集一起发布(maint, master, next, pu)。出于您的目的,为每个子存储库设置一个远程并将其分支提示提取到您的聚合存储库中可能就足够了。也许自动“远程跟踪分支”就足够了,或者您可能需要采取额外的步骤来基于远程跟踪分支创建(和更新)本地分支。

您描述的子树合并方案在源存储库中的分支不相关或仅半相关的一般情况下可能没有意义。但是,如果所有源存储库共享一组分支,其中每个分支都有一个在所有存储库中相同的给定用途,那么您可能可以有意义地将它们合并到一种超级存储库中。

但有趣的问题不是“如果两个存储库具有相同名称的分支怎么办?”,而是“如何处理存储库缺少共享‘全局’集中的分支的情况?”。

如果所有子存储库都有相同的分支集,您只需执行与master,但每个分支一次。当存储库中缺少特定分支时就会出现问题。你可以替换它master,但这可能并不总是正确的答案。这取决于您首先将存储库聚合在一起的原因以及您期望在超级存储库中该分支的子树中“看到”什么。

如果子存储库是not密切相关,那么我真的很怀疑这种子树方式的合理性。这种针对不相关存储库的方法感觉像是“违背常理”。这可能仍然是可能的,但我怀疑是否有任何工具可以提供帮助,并且您需要花一些时间规划极端情况。

如果您最终坚持使用子树合并,您可以查看第三方git subtree http://github.com/apenwarr/git-subtree/blob/master/git-subtree.txt命令。它可能有助于保持无数存储库的同步。


收集分支,不合并

如果Redmine指定--mirror克隆,这意味着它需要本地分支,并且可能无法直接读取“远程跟踪分支”,因此您可能需要创建和更新一些本地分支。

Local Branches Updated From ‘Remote Tracking Branches’
  • 初始设置

    mkdir $COLLECTION_REPO && cd $COLLECTION_REPO &&
    git init
    git remote add alpha <url/path-to-alpha-repo>
    git remote add bravo <url/path-to-bravo-repo>
    git remote add charlie <url/path-to-charlie-repo>
    for r in $(git remote); do
        git config --add remote.$r.fetch \
          "$(git config remote.$r.fetch | sed -e 's.heads.tags.;s.remotes.tags/all.')"
        git config remote.$r.tagopt --no-tags
    done
    
  • 定期更新

    git remote update
    git for-each-ref --shell --format \
      'git branch --force --track -l all/%(refname:short) %(refname:short)' refs/remotes \
      | sh
    
Local Branches That Directly Receive Fetched Branch Tips
  • 初始设置

    mkdir $COLLECTION_REPO && cd $COLLECTION_REPO &&
    git init
    git remote add alpha <url/path-to-alpha-repo>
    git remote add bravo <url/path-to-bravo-repo>
    git remote add charlie <url/path-to-charlie-repo>
    for r in $(git remote); do
        git config remote.$r.fetch \
          "$(git config remote.$r.fetch | sed -e 's.remotes.heads/all.')"
        git config --add remote.$r.fetch \
          "$(git config remote.$r.fetch | sed -e 's.heads.tags.g')"
        git config remote.$r.tagopt --no-tags
    done
    
  • 定期更新

    git remote update
    

两种方法最终都会收集下分​​支refs/heads/all/<remote-name>/<branch-name-on-remote>,但第一个也有一组重复的参考文​​献refs/remotes/<remote-name>/<branch-name-on-remote>。第一个使用普通的 fetch refspec 并使用git branch复制“远程跟踪分支”(refs/remotes/…)进入正常的本地分支(refs/heads/all/…)。第二个使用自定义 refspec 将获取的引用直接存储到目标引用层次结构中。

由于更新被盲目地提取到这个组合存储库中,任何人都不应该尝试直接使用它:没有直接在其分支上进行提交,没有从外部推送。如果有人要在本地进行提交或推送到其中一个分支,那么这些提交将在下一次更新完成时被清除。

如果 Redmine 可以处理裸存储库,我建议使用一个。使用git init --bare以及以 .git 结尾的存储库名称。还git config core.logAllRefUpdates true可能是一个好主意(因为这在裸存储库中默认为 false)。

除了all/命名空间中的前缀,这是此方法与完整方法之间的另一个区别--mirror克隆是外部的引用refs/heads and refs/tags不会被收集。大多数其他常见引用被认为是存储库的“本地”(这就是为什么它们不会被普通克隆复制)。其他一些参考文献是“远程跟踪分支”(refs/remotes),一些“平分”记录保存(refs/bisect), git filter-branch‘原始’引用备份(refs/original)等。也许这些其他事情对于Redmine来说都不重要。如果是的话,它们也可以包含在额外的参考规范中。

创建额外的初始提交

要安排具有新初始提交的分支,请参阅Git 提示页面 http://git.wiki.kernel.org/index.php/GitTips under 如何创建一个没有祖先的新分支 http://git.wiki.kernel.org/index.php/GitTips#How_to_create_a_new_branch_that_has_no_ancestor。其中两个配方涉及另一个存储库,在完成通常的初始化/添加/提交步骤后,您可以从该存储库推送或获取分支(正是上述配方以自动化方式执行的操作)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用git子树合并,同时也在所有合并子树的所有分支中进行合并 的相关文章

  • 使用 GitHub 时防止将大文本文件添加到提交

    我们想要防止 非常大的文本文件 每个文件 gt 50MB 被提交到git代替git lfs 因为它们夸大了 git 历史 问题是 其中 99 大小差异的原因 这些是 YAML 文件 它们支持通过 Base64 编码进行二进制序列化 我们无法
  • 即使给出了公钥,Gitosis 也需要密码

    我在 Archlinux 上尝试配置 gitosis 时遇到了一些问题 http wiki archlinux org index php Setting Up Git ACL Using gitosis http wiki archlin
  • 从TFS迁移到GIT,共享项目到nuget

    我所在的软件团队由 4 5 名开发人员组成 他们从事一个 TFS 项目 我们正在考虑将整个代码库移至 GIT 该代码库由约 50 个 Visual Studio 2013 解决方案组成 分为约 300 个项目 引用项目中另一个程序集的首选过
  • 我可以用一个命令销毁并重新创建 Git 远程分支吗?

    在 Git 中 我有时会在长期运行的分支上工作 我喜欢时不时地重新建立 master 基础 以便在准备好时使合并变得更容易 变基后 我无法将先前推送的分支推送到远程 因为我的分支的历史记录不再与该分支的远程历史记录一致 所以我必须先删除它
  • 让“git pull”在拉取不同分支时要求确认

    当同时处理许多项目和分支时 我偶尔会犯一些愚蠢的错误 比如拉入错误的分支 例如在分支上master I did git pull origin dangerous code并且有一段时间没有注意到这一点 这个小错误造成了很大的混乱 当我尝试
  • git push heroku master 通过代理后面的 ssh 出现错误

    简要背景 大家好 我是一名大学生 代理 10 3 100 211 8080 刚接触 ROR Git 和 Heroku 一直在关注 Ruby on Rails 教程 我解决了通过 ssh 推送 git repo 的问题 在我的 ssh con
  • 合并分支时,Git 不显示已删除行的当前/传入更改

    我正在尝试了解有关 git 分支 合并的更多信息 一直以来只使用 master 分支 我分支两次 然后执行合并 为什么 git 只显示新的冲突行 我想知道为什么删除 熊 根本没有突出显示为更改 您已经在评论中介绍了其中的一些内容 但让我们把
  • 更改 git diff 输出前后的行数

    我想增加更改之前和之后显示的行数git diff output 类似于grep A3 B5 根据git diff help git diff支持与标准相同的参数diff命令 w r t 上下文 U
  • GitHub Web UI 中的“base”和“head”存储库是什么?

    GitHub 的 UI 相当不直观且考虑不周 所以这里有一个问题 什么是 头 回购 什么是 基础 回购 不知道是从哪一个抄来的 基础 和 头部 这两个词的意思是相同的 链表的 头 类似于树的 基 GitHub 有叉树和文件树 Head 和
  • 通过 SFTP 克隆 Git 存储库

    每次我尝试克隆 Git 存储库时都会遇到致命错误 我运行这个 git clone sftp email protected cdn cgi l email protection git foobar git 我得到这个 fatal Unab
  • 如何使用 Github Pages 分支正确提交到存储库中

    我有一个问题 情况基于gh pages https pages github com 我的项目使用预处理器和其他困难的人员 因此 我的项目结构如下所示 主分支 src node modules public js css etc index
  • 如何在Windows Git shell中运行./script.sh?

    也许这很尴尬 但是当我在 Git shell 中工作时 我无法在 Windows 上运行 sh 文件 也许我必须安装一些东西 但我认为 Git 会支持 bash 命令 我知道 Windows 不使用 sh 文件 我正在执行安装步骤游戏结束
  • 如何在gitlab存储库中下载单个文件夹或文件

    我有一个存储库 在此存储库中 有多个文件夹可用 我只需要此存储库中的一个文件夹 我已经尝试遵循命令 但它不起作用 克隆 有没有办法只克隆 git 存储库子目录 https stackoverflow com questions 600079
  • 如何对 git 子模块使用相同的协议?

    在 git 存储库 R 中 我有一个使用以下命令初始化的子模块 git submodule add git mygitserver 现在用户刚刚使用克隆 Rhttps并在运行时出现错误 git submodule init git subm
  • 在 VS Code 中找不到 Git

    由于某种原因 我在 Windows 10 笔记本电脑上运行的 VS Code 中找不到 Git 在我的 Mac 上 当你一直向下滚动时 用户默认设置 中会出现一个 Git 但在我的 Windows 10 笔记本电脑上 它根本不存在 源代码管
  • 在ansible中合并字典

    我目前正在构建一个使用 ansible 安装 PHP 的角色 并且在合并字典时遇到一些困难 我尝试了多种方法来做到这一点 但我无法让它像我想要的那样工作 A vars file my default values key value my
  • 为什么某些 Git 分支名称中包含斜杠?

    我正在阅读本教程https www atlassian com git tutorials syncing git fetch https www atlassian com git tutorials syncing git fetch
  • Visual Studio 2013删除已删除的git分支

    我遇到这个问题 在 VS2013 中 当我从源创建一个新分支时 源分支的下拉列表列出了曾经创建的所有分支 这包括长期从本地存储库和远程 源存储库中删除的分支 如何删除已删除的分支 Visual Studio 将它们保存在本地缓存中 您可以从
  • 子 git 存储库作为主存储库的子集

    我正在寻找一种方法来设置 git 存储库 其中包括来自较大存储库的文件子集 并从该主存储库继承历史记录 我的主要动机是能够通过 GitHub 共享代码子集 我目前通过单个 git 存储库管理我的研究相关 主要是 Matlab 代码 代码本身
  • 我可以将 Azure Dev Ops 构建定义同时用于发布管理管道和拉取请求,但后者不会触发管道吗

    简而言之 我们希望使用构建定义来生成用于发布管理的工件并检查拉取请求 但不允许后者触发新版本 我们在 Git Repo 上有 CI 构建定义 将工件输入到发布管理管道中 与许多团队一样 我们也设置了 Pull 请求来保护我们的 git ma

随机推荐