我有一个位于git
的/home/v/git_repo
回购,其中我有一个子目录./a/b/c
的子模块。
$ cat /home/v/git_repo/.gitmodules
[submodule "foo/bar"]
path = a/b/c
url = [email protected]:username/repo.git
拥有完整路径或只有存储库中的子路径(我已在辅助脚本git-where-in-repo-am-i-currently
中实现)
$ pwd
/home/v/git_repo/a/b/c/something
$ git where-in-repo-am-i-currently
a/b/c/something
我想找出(最好在fish
)这条路径属于哪个子模块:例如
$ git which-submodule (pwd)
foo/bar
以后用它来查询子模块的状态
$ git -C (git rev-parse --git-dir)/modules/(git which-submodule) status
on branch master
Your branch is up to date with 'origin/master'
并最终在我的提示中显示此信息(该部分已经实现)
解析输出
$ git -C (git rev-parse --show-toplevel) config --file=.gitmodules --get-regexp "path"`
submodule.foo/bar.path a/b/c
并将我的子目录路径与子模块的路径进行比较,但它相当混乱,将路径拆分为数组和各种黑客攻击
对于您在此处描述的常规设置,您可以使用与子模块嵌套匹配的工作树嵌套
mytoplevel=`git rev-parse --show-toplevel`
abovethat=`git -C "$mytoplevel"/.. rev-parse --show-toplevel`
然后,
echo ${mytoplevel#$abovethat/}
将为您提供超级项目中的子模块路径,或者您可以
echo ${PWD#$abovethat/}
获取当前目录相对于超级项目的路径。
所以:
me=`git rev-parse --show-toplevel`
up=`git -C "$me"/.. rev-parse --show-toplevel`
subpath=${me#$up/}
git -C "$up" config -f .gitmodules --get-regexp '^submodule\..*\.path$' ^$subpath$
从超级项目的配置条目中获取当前repo的子模块名称和路径。
但是,Git在任何可以想象的构建系统中都很有用;它没有对如何设置其职权范围内的事情施加限制。如此简短的文件系统命名空间搜索,你不能确定你发现每个人都使用任何工作树作为子模块结账,Git没有理由关心如何使用存储库。
例如,如果多个项目都需要运行相同的子模块转换,您可以使用单个repo和worktree作为它们的共享子模块:而不是必须遍历它们中的每一个并执行同步检出,并且然后相信你没有错过一个,只需使用一个仓库,一个工作树,并指出每个人都使用它。
对于具有该需求的工作流程,这可以比通常的设置更具吸引力,所有用户根据定义看到同步的当前子模块修订版,并且任何需要知道具有更新的“新内容”的客户端可以例如git -C utils diff `git rev-parse :utils` HEAD
,每个子模块用户都有自己的跟踪分支,可以使用Git的所有工具来帮助保持最新状态或解决冲突。
因此,要重新创建您的设置,我会:
git init git_repo; cd $_
mkdir a/b; git init a/b/c; cd $_
mkdir something; touch something/somefile;
git add .; git commit -m-
cd `git -C .. rev-parse --show-toplevel`
git submodule add --name foo/bar ./a/b/c -- a/b/c
git add .; git commit -m-
然后,当我尝试时,我得到这个:
$ find -print -name .git -prune
.
./a
./a/b
./a/b/c
./a/b/c/something
./a/b/c/something/somefile
./a/b/c/.git
./.gitmodules
./.git
$ git grl
core.repositoryformatversion 0
core.filemode true
core.bare false
core.logallrefupdates true
submodule.foo/bar.url /home/jthill/src/snips/git_repo/a/b/c
submodule.foo/bar.active true
$ cd a/b/c/something
$ me=`git rev-parse --show-toplevel`
$ up=`git -C "$me"/.. rev-parse --show-toplevel`
$ subpath=${me#$up/}
$ git -C "$up" config -f .gitmodules --get-regexp '^submodule\..*\.path$' ^$subpath$
submodule.foo/bar.path a/b/c
$ echo $me $up $subpath
/home/jthill/src/snips/git_repo/a/b/c /home/jthill/src/snips/git_repo a/b/c
如果这个设置与你描述的内容有所不同,我就错过了它,我有目录结构,子模块名称,起始目录...如果你将逐步完成并找到设置的位置或结果与你的结果不同我认为这有帮助。