我在git
中有一个/home/v/git_repo
存储库,其中有一个子模块位于子目录./a/b/c
中。
$ cat /home/v/git_repo/.gitmodules
[submodule "foo/bar"]
path = a/b/c
url = git@github.com: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
并将我的子目录路径与子模块的路径进行比较,但这很混乱,将路径分为数组和各种hacks
答案 0 :(得分:1)
对于您在此处描述的常规设置,通过工作树嵌套与子模块嵌套匹配,您可以
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$
从其超级项目中的config条目获取当前存储库的子模块名称和路径。
Git在任何可以想象的构建系统中都是有用的;它不会对权限范围之外的内容设置任何限制。因此,缺少对文件系统名称空间的详尽搜索,您无法确定是否发现每个人都使用任何工作树作为子模块检出,因此Git没有理由担心存储库的使用方式。
例如,如果多个项目都需要在同一子模块版本上运行,则可以有一个仓库,而工作树则可以作为它们的共享子模块:而不是必须遍历每个项目并进行同步结帐,然后相信您没有错过任何一项,只需使用一个回购和一个工作树,然后让每个人都使用它即可。
对于有此需求的工作流程,它可以比通常的设置好得多,所有用户根据定义都可以看到同步的当前子模块修订版,并且任何需要了解“新功能”的客户端都可以例如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
如果此设置与您所描述的有区别,我会丢失它,我有目录结构,子模块名称,起始目录...如果您逐步进行查找,我认为这对您的设置或结果有所不同。