Bash 使用`git submodule foreach`运行包含git命令的脚本会导致`not a git repository`错误
我在项目中使用了几个git子模块,每个子模块都有自己的依赖项。我正在运行顶级的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命
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:好了。我花了一段时间才找到——本地环境变量,不过我还是先找到了。:-)