太长了;博士

太长了;博士

太长了;博士

该命令git fetch origin [branch-name]在脚本中调用时不起作用,但在从 shell 调用时起作用。

脚本和终端在另一个盒子上运行得很好。该盒子位于公司代理后面。

我认为与 shell 相比,脚本中的环境存在一些差异。

问题

如何让该命令在脚本中运行?

详细信息

背景故事

在将存储库迁移到 GitHub 之前,两个系统上的所有功能均正常运行。两个系统上的源都进行了相应的更新。开发系统立即开始运行,而暂存系统则无法运行。

脚本

这就是脚本部分的外观,它在实际启动之前检查所有存储库是否已到达,因此在此停止:

check_git_connection_mapbender() {
  cd ${installation_folder}mapbender
  git fetch origin ${git_mapbender_repositoryBranch} &>/dev/null
  if [ $? -ne 0 ]; then
    echo "Fetching Mapbender repository failed!"
    echo "Abording update..."
    exit 1
  fi
  set_git_filemode_config
}

这两echo行被回显并且脚本退出。变量都设置好了。

我尝试过的

比较贝壳

由于我怀疑环境变量存在问题,因此我尝试git fetch origin [branch-name]直接从终端调用失败的命令。当从 shell 调用时,该命令在所有情况下都有效:

  1. me@box:/path/to/repo$ git fetch origin [branch-name]
  2. me@box:/path/to/repo$ sudo git fetch origin [branch-name]
  3. me@box:$ sudo -i cd /path/to/repo && git fetch origin [branch-name]
  4. me@box:$ sudo su -->root@box: cd /path/to/repo && git fetch origin [branch-name]

似乎不起作用的是以下方法:

  1. me@box:$ sudo -i-> root@box: cd /path/to/repo && git fetch origin [branch-name]<--这确实会像脚本中那样抛出错误

git配置

起初,我确保两个系统上的有效 git 配置是相同的。

从那时起,我尝试在暂存系统上添加某些选项来解决问题,但没有成功。

我尝试设置:

  1. url.http://.insteadof=https://
  2. http.https://github.com.sslverify=false
  3. http.proxy
  4. https.proxy
  5. http.sslCert

因为它没有帮助我再次将其删除。

调试连接

我添加export GIT_TRACE_CURL=true到脚本中,所以它看起来像这样:

check_git_connection_mapbender() {
  cd ${installation_folder}mapbender
# DEBUG
  export GIT_TRACE_CURL=true
  source /etc/environment
  echo $http_proxy
  echo $https_proxy
# END DEBUG
  echo $git_mapbender_repositoryBranch
  git fetch origin ${git_mapbender_repositoryBranch} # &>/dev/null
  if [ $? -ne 0 ]; then
    echo "Fetching Mapbender repository failed!"
    echo "Abording update..."
    exit 1
  fi
  set_git_filemode_config
}

...输出是

[correct http_proxy environment variable]
[correct https_proxy environment variable]
[correct branch name]
16:52:17.600248 http.c:599              == Info: Couldn't find host github.com in the .netrc file; using defaults
16:52:17.603973 http.c:599              == Info:   Trying 140.82.121.4...
16:52:17.604035 http.c:599              == Info: TCP_NODELAY set
16:52:17.605297 http.c:599              == Info: connect to 140.82.121.4 port 443 failed: Verbindungsaufbau abgelehnt
16:52:17.605372 http.c:599              == Info: Failed to connect to github.com port 443: Verbindungsaufbau abgelehnt
16:52:17.605386 http.c:599              == Info: Closing connection 0
fatal: unable to access 'https://github.com/LVGL-SL/mapbender-sl.git/': Failed to connect to github.com port 443: Verbindungsaufbau abgelehnt
Fetching Mapbender repository failed!
Abording update...

代理配置

我被告知,系统应该遵守与子网相同的防火墙规则集。

答案1

该盒子位于公司代理后面。

在 .netrc 文件中找不到主机 github.com;使用默认值

连接到 140.82.121.4 端口 443 失败:Verbindungsaufbau abgelehnt

该脚本使用 sudo 运行并失败,但命令 git fetch origin [branch-name] 将在终端中运行

猜测:您的公司代理需要凭据,这些凭据存储在您的用户帐户下的某个位置(可能在文件中).netrc

如果您以普通用户身份运行 git 命令,它将访问这些凭据。

如果您以 root 身份运行该脚本,它将在 root 的主目录中查找凭据,但找不到它们,因此会失败。

sudo您可以通过从终端运行 git 命令来进行验证;如果是以上原因,也会失败。

要解决您的问题,您需要解释为什么要以 root 身份运行脚本,该脚本需要普通用户的凭据才能访问 github(这听起来像是应该首先解决的基本设计问题)。根据解释,您可以为代理提供 root 凭据(不明智),在脚本中模拟特定用户来执行 git 命令,或者,这是最好的变体,修复任何需要 root 访问权限的内容,这样就不需要 root访问,并且可以作为普通用户运行。

相关内容