[英]howto find out which git submodule current directory belongs to
我有一個git
repo 位於/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
並將我的子目錄路徑與子模塊的路徑進行比較,但它相當混亂,將路徑拆分為數組和各種黑客
對於您在此處描述的通常設置,使用與子模塊嵌套匹配的工作樹嵌套,您可以
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 沒有理由關心存儲庫的使用方式。
例如,如果多個項目都需要運行同一個子模塊 rev,您可以將單個 repo 和 worktree 作為它們的共享子模塊:而不是必須遍歷每個項目並進行同步檢出,以及然后相信你沒有錯過一個,只需使用一個 repo 和一個工作樹,並指出每個人都在使用它。
對於有這種需求的工作流,這可能比通常的設置要好得多,根據定義,所有用戶都會看到同步的當前子模塊修訂版,任何需要通過更新了解“新功能”的客戶端都可以例如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
如果此設置與您所描述的有所不同,我會遺漏它,我有目錄結構、子模塊名稱、起始目錄...如果您逐步完成並找到設置的位置或者結果與您的不同,我認為這會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.