是否可以连贯地管理多个存储库?

Jus*_*ᚄᚒᚔ 11 git multiple-repositories

我有一组git存储库,它们是独立版本但彼此相关的.例如,在添加功能时,我可能必须向共享库添加功能,然后扩展应用程序或服务以利用该功能.

目前,我必须在处理该功能时触摸的每个存储库上创建一个分支.然而,我想要做的是通过一次分支和合并这些多个存储库来简化过程(以减少忘记分支,或在一个存储库中提交/合并但不在另一个存储库中提交/合并的可能性).

是否有一种简单的方法可以同时分支和合并多个存储库,或者这是一个更适合帮助程序脚本集合的任务?如果是后者,是否有任何可用的脚本已经完成此操作?

Dan*_*man 7

没有一种内置的方法可以同时处理多个存储库,如果你考虑git的分布式特性,除了可以定义它的社会约定之外,什么都没有.(考虑一下,如果有人在一个存储库中从你那里撤走,而另一个存储库中的另一个遥控器,你会有这种连贯性吗?)

您可能会发现像mr这样的工具,它同时适用于多个存储库,非常有用.

但是,如果你真的有紧密相关的东西,我建议你把它们放到一个存储库中.这样你就不会忘记任何步骤,因为它们发生在一个原子操作中.

但是,如果你的代码实际上并没有紧密联系在一起,那么就放弃"必须在同一时间分支"的概念,你就会更快乐.


Cez*_*ski 5

您可以使用repo工具:https://gerrit.googlesource.com/git-repo/

  • 在多个项目上设置相同的分支
  • 使用一个命令查看多个存储库(分支,未合并提交)的状态
  • 使用清单文件管理一组存储库(克隆,同步等)
  • 很多其他很酷的东西


Von*_*onC 5

没有内置的方法可以同时处理多个存储库

但会有的。

Git 2.27(2020 年第二季度)为“”铺平了道路git update-ref --stdin,它学习了一些新动词,让用户更明确地控制引用更新事务。

这有助于跨多个存储库实现两阶段提交式原子引用更新

请参阅提交 e48cf33提交 94fd491提交 de0e0d6提交 804dba5提交 5ae6c5a提交 a65b8ac(2020 年 4 月 2 日)和提交 bd021f3提交 faa35ee提交 edc3069(2020 年 3 月 30 日),作者:Patrick Steinhardt ( pks-t)
(由Junio C Hamano 合并 -- gitster--d2ea03d 提交中,2020 年 4 月 29 日)

update-ref:实现交互式事务处理

签署人:帕特里克·斯坦哈特

git-update-ref命令现在只能通过其“ --stdin”参数处理排队事务,但用户无法以更明确的方式处理事务本身。

例如,在复制场景中,人们可以想象一个协调器为多个存储库生成git-update-ref,并且只有当所有存储库都同意可以进行更新时,协调器才会发送提交。

这样的交易会话可能看起来像

> start
< start: ok
> update refs/heads/master $OLD $NEW
> prepare
< prepare: ok
# All nodes have returned "ok"
> commit
< commit: ok
Run Code Online (Sandbox Code Playgroud)

或者:

> start
< start: ok
> create refs/heads/master $OLD $NEW
> prepare
< fatal: cannot lock ref 'refs/heads/master': reference already exists
# On all other nodes:
> abort
< abort: ok
Run Code Online (Sandbox Code Playgroud)

为了允许此类事务会话,此提交引入了四个新命令git-update-ref,它们与我们内部已有的命令相匹配,但“”除外start

  • start:开始新的交易
  • prepare:准备交易,即尝试锁定所有引用并验证它们的当前值与预期值匹配
  • commit:显式提交会话,即更新引用以匹配其新的预期状态
  • abort:中止会话并回滚所有更改

根据设计,git-update-ref将在标准输入关闭后立即提交。
虽然在非交易世界中这很好,但在交易世界中这绝对是意想不到的。
因此,一旦使用任何新的事务命令,默认值将更改为中止,而无需显式“ commit”。为了避免排队更新与启动事务的
第一个“ ”之间的竞争,已添加“ ”命令来启动显式事务。preparestart

添加一些测试来练习这个新功能。


Git 2.28(2020 年第 3 季度)延续了这种同时处理多个存储库的内置方式,并增加了一个新的 hook

请参阅帕特里克·斯坦哈特 (Patrick Steinhardt )的提交 6754159(2020 年 6 月 19 日)。(由Junio C Hamano 合并 -- --提交33a22c1,2020年 7 月 6 日)pks-t
gitster

refs:实现参考交易钩子

签署人:帕特里克·斯坦哈特

用于更新引用的低级引用事务当前对用户完全不透明。
虽然在大多数用例中当然是可取的,但有些用例可能希望挂接到事务中以观察所有排队的引用更新以及观察准备好的事务的中止或提交

其中一个用例是拥有给定 Git 存储库的一组副本,我们同时对所有存储库执行 Git 操作,并期望所有存储库的结果都相同。

虽然 Git 命令的某个子集已经存在可用于实现投票机制的钩子,但许多其他命令目前没有任何机制。

上述场景是新的“引用事务”钩子的动机,该钩子直接进入 Git 的引用事务机制。

该钩子接收事务移动到的当前状态(“ prepared”、“ committed”或“ aborted”)作为参数,并通过其标准输入获取所有排队的引用更新。

虽然退出代码在“已提交”和“中止”状态下被忽略,但“准备”状态下的非零退出代码将导致事务过早中止。

鉴于上述用例,现在可以通过此钩子实现投票机制:一旦调用它,它将获取所有标准输入并使用它向中央服务投票。
当存储库的所有副本都同意时,挂钩将以零退出,否则它将通过返回非零来中止事务。
最重要的好处是,这将捕获一次写入引用的所有命令,从而允许通过单一机制实现引用更新的强一致性。

为了测试对存储库中没有安装任何“reference-transaction”挂钩的情况的影响,此提交为git-update-refs引入了两个新的性能测试。
针对空存储库运行,它会产生以下结果:

Test                         origin/master     HEAD
--------------------------------------------------------------------
1400.2: update-ref           2.70(2.10+0.71)   2.71(2.10+0.73) +0.4%
1400.3: update-ref --stdin   0.21(0.09+0.11)   0.21(0.07+0.14) +0.0%  
Run Code Online (Sandbox Code Playgroud)

性能测试p1400.2创建、更新和删除分支一千次,因此平均运行时间git-update-refs超过 3000 次调用。
p1400.3相反,调用git-update-refs --stdin三次并分别对一千个创建、更新和删除进行排队。

正如预期的那样,p1400.3始终没有显示出明显的影响,因为对于每批更新,都会有一个对 access(3P) 的调用来进行负挂钩查找。
另一方面,对于p1400.2,我们可以看到该补丁集造成的影响。但进行了五次性能测试,每次运行的GIT_PERF_REPEAT_COUNT=10,开销范围在 -1.5% 到 +1.1% 之间。这些不一致的性能数字可以通过生成 3000 个进程的开销来解释。这表明组装钩子路径并执行一次 access(3P) 以检查它是否存在的开销大部分都超过了操作系统的开销。


在 Git 2.29(2020 年第 4 季度)中,通过删除无效的优化,简化了挂钩。

请参阅帕特里克·斯坦哈特 (Patrick Steinhardt )的提交 0a0fbbe(2020 年 8 月 25 日)。(由Junio C Hamano 合并 -- --提交 6ddd76f中,2020 年 8 月 31 日)pks-t
gitster

refsreference-transaction:删除钩子的查找缓存

签署人:帕特里克·斯坦哈特

添加reference-transaction挂钩时,有人担心它可能会对根本不使用新挂钩的设置产生性能影响。
毕竟,每次reftx准备、提交或中止 a 时都会执行它,这与每个会话创建的参考事务的数量成线性比例。
由于存在像( man )这样的代码路径,它为每个要更新的引用创建一个新事务,这可能会导致调用相当多。git pushfind_hook()

为了解决这个问题,添加了一个缓存,目的是不重复进行负挂钩查找。
事实证明,此缓存导致了回归,已通过e5256c82e5修复(“ refs:使用引用事务挂钩修复交错挂钩调用”,2020-08-07,Git v2.29.0 -合并在批次 #8中列出)。

在讨论修复的过程中,我们意识到即使在负查找情况下缓存也没有真正的帮助。
虽然添加到基准测试中的性能测试确实显示了 1% 范围内的轻微改进,但这实际上并不能保证拥有缓存。
此外,它也很脆弱。例如,连续运行两次会产生以下结果:

Test                         master            pks-reftx-hook-remove-cache
--------------------------------------------------------------------------
1400.2: update-ref           2.79(2.16+0.74)   2.73(2.12+0.71) -2.2%
1400.3: update-ref --stdin   0.22(0.08+0.14)   0.21(0.08+0.12) -4.5%

Test                         master            pks-reftx-hook-remove-cache
--------------------------------------------------------------------------
1400.2: update-ref           2.70(2.09+0.72)   2.74(2.13+0.71) +1.5%
1400.3: update-ref --stdin   0.21(0.10+0.10)   0.21(0.08+0.13) +0.0%
Run Code Online (Sandbox Code Playgroud)

这些基准测试中明显缺少的一种情况是单个可执行文件搜索钩子数百次,这正是添加负缓存的情况。
p1400.2将为每个事务生成一个新的 update-ref,并且p1400.3对于所有引用更新只有一个引用事务。
因此,此提交添加了第三个基准,该基准执行一千个引用的非原子推送。这将为每个引用创建一个新的引用事务。但即使对于这种情况,负缓存也不能持续提高性能:

Test                         master            pks-reftx-hook-remove-cache
--------------------------------------------------------------------------
1400.4: nonatomic push       6.63(6.50+0.13)   6.81(6.67+0.14) +2.7%
1400.4: nonatomic push       6.35(6.21+0.14)   6.39(6.23+0.16) +0.6%
1400.4: nonatomic push       6.43(6.31+0.13)   6.42(6.28+0.15) -0.2%
Run Code Online (Sandbox Code Playgroud)

因此,让我们完全删除缓存以简化代码。


在 Git 2.30(2021 年第 1 季度)中,“ ( man ) ”学会在单个会话中进行多个事务。git update-ref --stdin

请参阅帕特里克·斯坦哈特 (Patrick Steinhardt )提交的提交 8c4417f提交 2102043提交 262a4d2提交 c0e1726(2020 年 11 月 13 日)。(由Junio C Hamano 合并 -- --提交 1bc550e中,2020 年 12 月 8 日)pks-t
gitster

update-ref:允许创建多个交易

签署人:Patrick Steinhardt
审阅人:Jeff King

虽然 git-update-ref 最近增加了允许对e48cf33b61中的事务进行交互式控制的命令(“ update-ref:实现交互式事务处理”,2020-04-02,Git v2.27.0-rc0 -合并在批次 #5中列出),但它尚不可能在单个会话中创建多个事务。为此,目前仍需要多次调用可执行文件。

如果当前事务已经提交或中止,则此提交通过允许“开始”命令创建新事务来解决此缺点。

git update-ref现在包含在其手册页中:

显式提交。当当前事务已提交或中止时,此命令可能会创建一个新的空事务。


在 Git 2.34(2021 年第 4 季度)之前,“ git update-ref( man ) --stdin无法根据需要刷新其输出,这可能会导致对话陷入僵局。

这已经被修复,并且是前面提到的路径的结果。

请参阅帕特里克·斯坦哈特 (Patrick Steinhardt )提交的 efa3d64(2021 年 9 月 3 日)。 请参阅Jeff King ( )的提交 7c12007(2021 年 9 月 15 日)。(由Junio C Hamano 合并 -- --提交 06a0eea,2021 年 9 月 23 日)pks-t
peff
gitster

update-ref:修复状态更新流

签署人:帕特里克·斯坦哈特

当使用该标志执行 git-update-ref(1) 时--stdin,用户可以对更新进行排队,并且自e48cf33 (" update-ref: 实现交互式事务处理", 2020-04-02, Git v2.27.0-rc0 -- merge中列出批次 #5),通过一组事务动词以交互方式驱动事务的状态。
不过,这种交互性在某种程度上被破坏了:虽然调用者可以使用这些动词来驱动事务的状态,但确认动词已被处理的状态消息不会被刷新。
因此,呼叫者可能会等待确认。

通过在写入状态更新后刷新标准输出来修复该错误。