簡體   English   中英

如何找出當前目錄屬於哪個git子模塊

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM