#!/bin/bash
function is_submodule() {
local top_level parent_git module_name path
# Find the root of this git repo, then check if its parent dir is also a repo
top_level="$(git rev-parse --show-toplevel)"
module_name="$(basename "$top_level")"
parent_git="$(cd "$top_level/.." && git rev-parse --show-toplevel 2> /dev/null)"
if [[ -n $parent_git ]]; then
# List all the submodule paths for the parent repo
while read path
do
if [[ "$path" != "$module_name" ]]; then continue; fi
if [[ -d "$top_level/../$path" ]]; then return 0; fi
done < <(cd $parent_git && git submodule --quiet foreach 'echo $path' 2> /dev/null)
#return 1
fi
return 1
}
用法
if is_submodule; then
echo "In a submodule!"
else
echo "Not in a submodule"
fi
function is_submodule() {
local git_dir parent_git module_name path strip
# Find the root of this git repo, then check if its parent dir is also a repo
git_dir="$(git rev-parse --show-toplevel)"
parent_git="$(cd "$git_dir/.." && git rev-parse --show-toplevel 2> /dev/null)"
if [[ -n $parent_git ]]; then
strip=$((${#parent_git} + 1))
module_name=${git_dir:$strip}
# List all the submodule paths for the parent repo
while read path
do
if [[ "$path" != "$module_name" ]]; then continue; fi
if [[ -d "$parent_git/$path" ]]; then
echo $module_name
return 0;
fi
done < <(cd $parent_git && git submodule --quiet foreach 'echo $path' 2> /dev/null)
fi
return 1
}
# Usage
submodule=$(is_submodule)
if [[ $? -eq 0 ]]; then
echo "In a submodule! $submodule"
else
echo "Not in a submodule"
fi
function is_git_submodule() {
local module_name
module_path="$(git rev-parse --show-toplevel 2> /dev/null)"
# List all the submodule paths for the parent repo and look for our module's path
(cd "${module_path}/.." && git submodule --quiet foreach 'echo $toplevel/$path' 2> /dev/null) | \
grep --quiet --line-regexp --fixed-strings "$module_path"
}
5条答案
按热度按时间s6fujrry1#
(2017年4月更新为Git 2。2017年第2季度13日)
现在有一个官方命令来确定一个repo是否是父repo的子模块:
参见commit bf0231c(2017年3月8日),作者Stefan Beller (
stefanbeller
)。(由Junio C Hamano --
gitster
--合并到commit 3edcc04,2017年3月17日)rev-parse
:添加--show-superproject-working-tree
在某些情况下,知道给定的存储库是否是另一个存储库的子模块是有用的。
在
git-rev-parse
中添加标志--show-superproject-working-tree
,以便于查找是否存在超级项目。当不存在超级项目时,输出将为空。
Jethro Yu在评论中建议:
获取超级项目路径,无论子模块内部/外部:
(2014年更新)正如Quentin Pradet所指出的,最近的Git子模块存储库显示了一个简单的
.git
* 文件 *,而不是.git
文件夹。该
.git
文件引用实际子模块git repo的路径,存储在 parent repo.git/modules
子文件夹中。jeffrson添加评论(2023):
现有的'
.git
'本身是不够的,因为这对于工作树是一样的。但是,该文件应该分别包含字符串“
modules
”或“worktrees
”作为目标的一部分。(原文回答:2011年9月)
子模块的本质是作为子模块的git repo不知道它被父repo用作子模块。
一个肮脏的把戏是:
git status --ignore-submodules=none
“如果您在
git status
的结果中看到了该文件,那么您的repo应该是一个子模块。如果它只是一个嵌套的repo,
git status
应该完全忽略你的嵌套repo。nuypyhwy2#
下面是一个shell函数,您可以使用它来检测:
编辑回应你的剧本:
看起来不错
cd
-ing来完成,但是这样返回退出码会变得很复杂 *$_git_dir
-我使用basename
(1)来得到这些信息(见下文)。while read
的“惯用”方法,而不需要像readarray
这样的新bash-isms)*$path
变量时。..)_git_dir
重命名为top_level
(这不太容易混淆,因为GIT_DIR的意思是别的意思)剩余问题:
用法
mcvgt66p3#
尝试
git rev-parse --git-dir
,当且仅当从项目根调用时,将返回".git"
:除非你设置了
$GIT_DIR
,它将是这种情况下的返回值(参见rev-parse):--git-dir
显示$GIT_DIR(如果已定义)。否则显示的路径。git目录。显示的路径(相对路径)是相对于当前工作目录的。
如果没有定义$GIT_DIR,并且没有检测到当前目录位于Git仓库或工作树中,则打印一条消息到stderr,并以非零状态退出。
qoefvg9y4#
我尝试了上面建议的脚本,它不适合我。当然,我可能是世界上唯一一个拥有不是父模块直接子模块的子模块的人。上面的代码假设它是。
最好显示父模块中的子模块路径--我打算用它来显示一个bash shell提示符,告诉我我是否在子模块中,以及在哪里。
以下是我的更新:
eimct9ow5#
所选答案不适用于不在顶层的子模块。这样做也更简单: