如何解决使用“git submodule foreach”运行包含 git 命令的脚本会导致“not a git repository”错误
我在我的项目中使用了几个 git 子模块,每个子模块都有自己的依赖项。我正在运行顶级 setup.sh
,它安装顶级 deps,然后运行它,它调用每个子模块的 setup.sh
脚本。
git submodule foreach 'if [ -e "setup.sh" ]; then ${SUDO} "`pwd`/setup.sh"; fi'
这运行良好,但是当 sub1
和 sub2
子模块调用它们自己的 setup.sh
脚本执行完全相同的操作时,问题就出现了。
当 sub1
和 sub2
setup.sh
脚本运行任何 git 命令时,它会失败并显示错误:
fatal: not a git repository: '.git'
pwd
和 sub1
脚本中的 sub2
为我提供了正确的路径,并且这些脚本可以单独运行。
项目结构:
.
├── setup.sh
└── submodules
├── sub1
| ├── setup.sh
| └── submodules
| └── sub3
| └── setup.sh
└── sub2
├── setup.sh
└── submodules
└── sub4
└── setup.sh
抱歉,如果这是一个愚蠢的问题,非常感谢。
解决方法
当一个命令本身可以正常工作,但在 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."
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。