如果文件更新,代理 git 提交消息到嵌套 repo

Proxy a git commit message to nested repo if files are updated

我正在寻找 git 中的功能或现有库,以允许执行下面描述的一些非常不正统的行为。

假设您有一个已 git 初始化的当前工作目录。

/project
  /.git

添加了一个 subprojects 文件夹,其中包含文件夹 alphabeta,每个文件夹都有自己的初始化状态。两个文件 alpha.txtbeta.txt 添加到根目录。每个都硬链接到各自的子项目文件夹。

这是使用的命令:

project$ touch alpha.txt
project$ touch beta.txt
project$ mkdir ./subprojects/alpha
project$ cd ./subprojects/alpha
subprojects/alpha$ git init
subprojects/alpha$ cd ../../
project$ mkdir ./subprojects/beta
project$ cd ./subprojects/beta
subprojects/beta$ git init
subprojects/beta$ cd ../../
project$ ln alpha.txt ./subprojects/alpha/alpha.txt
project$ ln beta.txt ./subprojects/beta/beta.txt

这是当前工作目录的树:

/project
  /.git
  /subprojects
    /alpha
      /.git
      /alpha.txt
    /beta
      /.git
      /beta.txt
  /alpha.txt
  /beta.txt

使用这些命令在根目录上进行提交:

project$ git add -A
project$ git commit -m "init root"

alpha.txt 的内容已更改 git status 是 运行 你看这个。

modified:   alpha.txt
modified:   subprojects/alpha/alpha.txt

你可以看到,因为两个文件是链接的,所以当一个文件被更改时,两个文件都会被修改,这很好。

这就是我想要的功能发挥作用的地方。我希望这样,当进行根提交以及修改子项目的内容时,子项目会在其本地 git 实例中使用该提交。

所以如果我在初始化后修改 alpha.txt,我 运行 如下:

project$ git add -A
project$ git commit -m "edited alpha"

现在当我 运行 根目录中的以下 git log

project$ git log --pretty=oneline
50144ab7da5466327038357bbc4f5adec85ed1d2 edited alpha
6f3f77763653f37e089fc0fe4c3ae6846f807855 init root

目前尚未提交子包alphabeta。因此,当 git log 为 运行 时,它的响应如下:

project/subproject/alpha$ git log --pretty=oneline
fatal: bad default revision 'HEAD'

我在时间线中此时的行为是 alphas 日志显示为:

project/subproject/alpha$ git log --pretty=oneline
50144ab7da5466327038357bbc4f5adec85ed1d2 edited alpha
6f3f77763653f37e089fc0fe4c3ae6846f807855 init root

并且 beta 阅读了这篇文章:

project/subproject/beta$ git log --pretty=oneline
6f3f77763653f37e089fc0fe4c3ae6846f807855 init root

这背后的逻辑是因为在父 project 存储库提交时 subproject 中的文件被编辑了,并且因为我们正在使用链接我们可以将其归因于与父级相同的 commit 消息。

关于如何做到这一点有什么想法吗?看清楚了吗?

gitslave 神奇地做到了这一点。 https://github.com/joelpurra/gitslave

brew tap joelpurra/joelpurra && brew install --devel joelpurra/joelpurra/gitslave