Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用`git submodule foreach`运行包含git命令的脚本会导致`not a git repository`错误_Bash_Git_Git Submodules - Fatal编程技术网

Bash 使用`git submodule foreach`运行包含git命令的脚本会导致`not a git repository`错误

Bash 使用`git submodule foreach`运行包含git命令的脚本会导致`not a git repository`错误,bash,git,git-submodules,Bash,Git,Git Submodules,我在项目中使用了几个git子模块,每个子模块都有自己的依赖项。我正在运行顶级的setup.sh,它安装顶级的deps,然后运行它,调用每个子模块的setup.sh脚本 git submodule foreach 'if [ -e "setup.sh" ]; then ${SUDO} "`pwd`/setup.sh"; fi' 这运行得很好,但是当sub1和sub2子模块调用它们自己的setup.sh脚本执行完全相同的操作时,问题就会出现。 当任何git命

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

git submodule foreach 'if [ -e "setup.sh" ]; then ${SUDO} "`pwd`/setup.sh"; fi'
这运行得很好,但是当
sub1
sub2
子模块调用它们自己的
setup.sh
脚本执行完全相同的操作时,问题就会出现。 当任何git命令由
sub1
sub2
setup.sh
脚本运行时,它会失败,并出现以下错误:

fatal: not a git repository: '.git'
sub1
sub2
脚本中的
pwd
为我提供了正确的路径,并且脚本可以独立工作

项目结构:

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

如果这是一个愚蠢的问题,我深表歉意,非常感谢。

当命令本身工作正常,但在
git子模块foreach
中工作不正常时,我的第一个怀疑是git的一些环境变量正在“泄漏”并影响命令。这里最常见的是GIT_DIR,因此替换为:

git submodule foreach 'some command'
与:

他经常回避这个问题

您可以使用以下工具获得此类变量的完整列表:

git rev-parse --local-env-vars
Git附带了一个shell脚本,
Git sh setup
,其中包含以下内容:

#清除repo本地GIT#环境变量。切换到时非常有用
#另一个存储库(例如,当输入子模块时)。另见env
#git_connect()中的列表
清除\u本地\u git\u env(){
unset$(git rev parse--本地环境变量)
}
这一行
unset$(git rev parse--local env vars)
命令将取消设置所有可能有问题的环境变量,因此如果
unset git_DIR
不够,那么
unset$(git rev parse--local env vars)
是更大的问题。1



1有些人说“如果它没有坏,就不要修复它”,但另一些人说,当命令本身工作正常,但不是在每个git子模块中时,我的第一个怀疑是git的一些环境变量正在“泄漏”并影响命令。这里最常见的是GIT_DIR,因此替换为:

git submodule foreach 'some command'
与:

他经常回避这个问题

您可以使用以下工具获得此类变量的完整列表:

git rev-parse --local-env-vars
Git附带了一个shell脚本,
Git sh setup
,其中包含以下内容:

#清除repo本地GIT#环境变量。切换到时非常有用
#另一个存储库(例如,当输入子模块时)。另见env
#git_connect()中的列表
清除\u本地\u git\u env(){
unset$(git rev parse--本地环境变量)
}
这一行
unset$(git rev parse--local env vars)
命令将取消设置所有可能有问题的环境变量,因此如果
unset git_DIR
不够,那么
unset$(git rev parse--local env vars)
是更大的问题。1



1有些人说“如果它没有坏,就不要修理它”,但另一些人说

只是一个猜测,但试试
unset GIT_DIR;如果[-e“setup.sh”]
(用剩下的部分填充
部分-基本上只是在foreach命令前面取消设置
GIT_DIR
。(如果这样做有效,那对我来说就像是
GIT子模块foreach
中的一个bug)这样做有效,谢谢@托雷克,你应该回答这个问题。@kzh:好了。我花了一段时间才找到
——本地环境变量,不过我还是先找到了。:-)只是一个猜测,但请尝试取消设置GIT_DIR;如果[-e“setup.sh”]
(用剩下的部分填充
部分-基本上只是在foreach命令前面取消设置
GIT_DIR
。(如果这样做有效,那对我来说就像是
GIT子模块foreach
中的一个bug)这样做有效,谢谢@托雷克,你应该回答这个问题。@kzh:好了。我花了一段时间才找到
——本地环境变量,不过我还是先找到了。:-)