【问题标题】:Running a script that contains git commands using `git submodule foreach` causes a `not a git repository` error使用 `git submodule foreach` 运行包含 git 命令的脚本会导致 `not a git repository` 错误
【发布时间】:2021-01-06 18:56:55
【问题描述】:

我在我的项目中使用了一些 git 子模块,每个子模块都有自己的依赖项。我正在运行顶级setup.sh,它安装顶级deps,然后运行它,它调用每个子模块的setup.sh 脚本。

git submodule foreach 'if [ -e "setup.sh" ]; then ${SUDO} "`pwd`/setup.sh"; fi'

这运行得很好,但是当sub1sub2 子模块调用它们自己的setup.sh 脚本时,问题就出现了。 当 sub1sub2 setup.sh 脚本运行任何 git 命令时,它会失败并显示错误:

fatal: not a git repository: '.git'

sub1sub2 脚本中的pwd 为我提供了正确的路径,并且这些脚本单独工作也很好。

项目结构:

.
├── setup.sh
└── submodules
    ├── sub1
    |   ├── setup.sh
    |   └── submodules
    |       └── sub3
    |           └── setup.sh
    └── sub2
        ├── setup.sh
        └── submodules
            └── sub4
                └── setup.sh

抱歉,如果这是一个愚蠢的问题,非常感谢。

【问题讨论】:

  • 只是猜测,但请尝试unset GIT_DIR; if [ -e "setup.sh" ]; ...(用其余部分填写... - 基本上只是在foreach 命令前面取消设置GIT_DIR)。
  • (如果可行,对我来说这似乎是git submodule foreach 中的一个错误)
  • @torek 你应该回答这个问题。
  • @kzh:完成。不过,我花了一段时间才再次找到--local-env-vars。 :-)

标签: bash git git-submodules


【解决方案1】:

当一个命令自己运行良好,但在git submodule foreach 中却不行时,我的第一个怀疑是 Git 的一些环境变量正在“泄漏”并影响命令。这里最常见的是GIT_DIR,所以替换:

git submodule foreach 'some command'

与:

git submodule foreach 'unset GIT_DIR; some command'

通常会解决问题。

您可以通过以下方式获得此类变量的完整列表:

git rev-parse --local-env-vars

Git 中包含一个 shell 脚本 git-sh-setup,其中包含以下内容:

# Clear repo-local GIT_* environment variables. Useful when switching to
# another repository (e.g. when entering a submodule). See also the env
# list in git_connect()
clear_local_git_env() {
        unset $(git rev-parse --local-env-vars)
}

而这个单行的unset $(git rev-parse --local-env-vars) 命令将取消设置所有 可能有问题的环境变量,所以如果unset GIT_DIR 不够,unset $(git rev-parse --local-env-vars) 是更大的锤子。1支持>


1有人说“如果没坏就别修”,但也有人说"if it ain't broke, you need a bigger hammer."

【讨论】:

    猜你喜欢
    • 2023-02-26
    • 2010-11-12
    • 2020-11-19
    • 1970-01-01
    • 2018-10-04
    • 2012-11-05
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    相关资源
    最近更新 更多