【问题标题】:Resolving submodule paths in git在 git 中解析子模块路径
【发布时间】:2014-11-28 11:46:30
【问题描述】:

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

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

我的 repo 结构如下所示:

    /
    |-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 shell


    【解决方案1】:

    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 变量的最后一点。

    【讨论】:

      猜你喜欢
      • 2017-07-01
      • 1970-01-01
      • 2023-01-24
      • 2018-01-29
      • 1970-01-01
      • 2022-01-15
      • 2015-09-03
      • 2018-12-19
      • 1970-01-01
      相关资源
      最近更新 更多