git 中的可读子模块状态信息
Readable submodule status information in git
我有一个脚本可以检查一个 repo,检查子模块,然后打印一些关于子模块的信息,以便用户知道他们正在处理哪个 tags/branches。
我自己工作站上的输出是这样的:
Entering 'SubModuleA',
* feature/some_feature_branch,
Branch is,
feature/some_feature_branch,
Tag is,
undefined,
Entering 'SubModuleB'
* (detached from 1.1.9)
Branch is
HEAD
Tag is
1.1.9^0
在此示例中,主仓库指向子模块 A 的功能分支和子模块 B 的标签。
但是当我在其他工作站或 VM 上使用 ansible 运行 这段代码时,输出看起来不同:
Entering 'SubModuleA',
* (detached from 1234abcd),
Branch is,
HEAD,
Tag is,
undefined,
Entering 'SubModuleB'
* (detached from a1b23c4d)
Branch is
HEAD
Tag is
1.1.9^0
代码如下所示:
git submodule foreach 'git branch | grep \* ; echo Branch is && git rev-parse --abbrev-ref HEAD ; echo Tag is && git name-rev --tags --name-only $(git rev-parse HEAD) '
这有点像我发现的其他示例的大杂烩,但我很难找到一致的东西。
剧本中状态检查之前的命令是
git submodule init
git submodule update
我不确定为什么会得到不同的结果。有没有什么可以可靠地一致地打印子模块的分支名称和标签名称?
我认为您混淆的根源是 git 存储的关于子模块状态的唯一信息是提交 ID。考虑一个有多个分支的现有存储库,比如这个:
克隆它:
$ git https://github.com/githubtraining/hellogitworld.git
$ cd hellogitworld
现在,获取命名分支的提交 ID(例如,'master'):
$ git rev-parse master
ef7bebf8bdb1919d947afe46ab4b2fb4278039b3
现在,检查提交 ID:
$ git checkout ef7bebf8bdb1919d947afe46ab4b2fb4278039b3
和运行 git status
:
$ git status
HEAD detached at ef7bebf
nothing to commit, working directory clean
如您所见,即使您签出了一个提交 ID
对应于一个命名的分支,git
不知道(因为你
直接找到提交 ID,而不是通过查找它
姓名)。
如果您克隆包含以下内容的存储库,就会发生这种情况
子模块。子模块通过提交 ID 检出 ,而不是
任何命名的分支。这实际上是一个关键特性:它确保
你总是得到相同的提交,即使分支在
链接存储库。
您可以使用git describe
命令获取
在这种情况下分支。例如:
$ git describe --all
heads/master
需要 --all
标志才能使 git describe
考虑分支名称和标签。
我有一个脚本可以检查一个 repo,检查子模块,然后打印一些关于子模块的信息,以便用户知道他们正在处理哪个 tags/branches。
我自己工作站上的输出是这样的:
Entering 'SubModuleA',
* feature/some_feature_branch,
Branch is,
feature/some_feature_branch,
Tag is,
undefined,
Entering 'SubModuleB'
* (detached from 1.1.9)
Branch is
HEAD
Tag is
1.1.9^0
在此示例中,主仓库指向子模块 A 的功能分支和子模块 B 的标签。
但是当我在其他工作站或 VM 上使用 ansible 运行 这段代码时,输出看起来不同:
Entering 'SubModuleA',
* (detached from 1234abcd),
Branch is,
HEAD,
Tag is,
undefined,
Entering 'SubModuleB'
* (detached from a1b23c4d)
Branch is
HEAD
Tag is
1.1.9^0
代码如下所示:
git submodule foreach 'git branch | grep \* ; echo Branch is && git rev-parse --abbrev-ref HEAD ; echo Tag is && git name-rev --tags --name-only $(git rev-parse HEAD) '
这有点像我发现的其他示例的大杂烩,但我很难找到一致的东西。
剧本中状态检查之前的命令是
git submodule init
git submodule update
我不确定为什么会得到不同的结果。有没有什么可以可靠地一致地打印子模块的分支名称和标签名称?
我认为您混淆的根源是 git 存储的关于子模块状态的唯一信息是提交 ID。考虑一个有多个分支的现有存储库,比如这个:
克隆它:
$ git https://github.com/githubtraining/hellogitworld.git
$ cd hellogitworld
现在,获取命名分支的提交 ID(例如,'master'):
$ git rev-parse master
ef7bebf8bdb1919d947afe46ab4b2fb4278039b3
现在,检查提交 ID:
$ git checkout ef7bebf8bdb1919d947afe46ab4b2fb4278039b3
和运行 git status
:
$ git status
HEAD detached at ef7bebf
nothing to commit, working directory clean
如您所见,即使您签出了一个提交 ID
对应于一个命名的分支,git
不知道(因为你
直接找到提交 ID,而不是通过查找它
姓名)。
如果您克隆包含以下内容的存储库,就会发生这种情况 子模块。子模块通过提交 ID 检出 ,而不是 任何命名的分支。这实际上是一个关键特性:它确保 你总是得到相同的提交,即使分支在 链接存储库。
您可以使用git describe
命令获取
在这种情况下分支。例如:
$ git describe --all
heads/master
需要 --all
标志才能使 git describe
考虑分支名称和标签。