解析 git 中的子模块路径



我正在尝试创建助手来选择所需的 git 子模块。很简单的事情:

    modules=`git submodule | sed 's/.* (.*) (.*/1/'`;
    select var in $modules; do 
        echo $var; 
        break; 
    done

我的存储库结构如下所示:

    /
    |-dir1
    |   |-submodule1
    |-dir2
        |-submodule1

当我将上面的脚本保存为可执行文件并从 shell 运行它时,我看到子模块的正确相对路径,如下所示:

    $ cd dir1
    $ git-submodule-select
    1) submodule1
    2) ../dir2/submodule2
    #?

但是,如果我尝试将相同的命令保存为我的 .gitconfig 中的 git 别名,无论我身在何处,它总是显示相对于 repo 根目录的路径:

    [alias]
        subs = "!f() { 
            modules=`git submodule | sed 's/.* \(.*\) (.*/\1/'`; 
            select var in $modules; do  
                echo $var; 
                break;  
            done; 
        }; f"
    $ cd dir1
    $ git subs
    1) dir1/submodule1
    2) dir2/submodule2
    #?

为什么会这样?我需要相对于我当前位置的路径 - 可以通过 git 别名完成吗?或者我必须只使用全局函数?

git 别名的文档包含您需要的内容。

别名。*

git 命令包装器的命令别名 - 例如,在定义 "alias.last = cat-file commit HEAD" 之后,调用 "git last" 等效于 "git cat-file commit HEAD"。为了避免脚本用法的混淆和麻烦,将忽略隐藏现有 Git 命令的别名。参数按空格分隔,支持通常的 shell 引用和转义。引号对或反斜杠可用于引号

如果别名扩展以感叹号为前缀,则会将其视为 shell 命令。例如,定义"alias.new = !gitk --all --not ORIG_HEAD",调用"git new"等效于运行shell命令"gitk --all -not ORIG_HEAD"。请注意,shell 命令将从存储库的顶级目录执行,该目录不一定是当前目录。GIT_PREFIX设置为通过从原始当前目录运行 git rev-parse --show-prefix 返回。请参阅 git-rev-parse。

具体来说,最后一点是关于 shell 命令将从何处执行以及GIT_PREFIX变量。

最新更新