解决git中的子模块路径

时间:2014-11-28 11:46:31

标签: git shell

我正在尝试创建帮助程序来选择所需的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别名来完成吗?或者我必须只使用全局函数?

1 个答案:

答案 0 :(得分:0)

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 rev-parse --show-prefix来设置GIT_PREFIX。见git-rev-parse。

特别是关于shell命令执行位置的最后一位和GIT_PREFIX变量。