为什么 git 在脚本中运行时要求输入用户名?

为什么 git 在脚本中运行时要求输入用户名?

我有一个Push命令,运行这个脚本:

FindGits |
{
    while read gitFolder; do
        parent=$(dirname $gitFolder);
        if [[ `git -C $parent status --porcelain` ]]; then
            echo;
            (
                echo $parent;
                git -C $parent status --porcelain
                git -C $parent add .
                git -C $parent commit -m "committed by script" 1>/dev/null 2>/dev/null
                if [[ $? == 128 ]]; then
                    git -C $parent commit -m "commited by script" 1>/dev/null 2>/dev/null
                    git -C $parent push
                    if [[ $? == 1 ]]; then
                        git -C $parent pull
                        git -C $parent push
                    fi
                else 
                    git -C $parent push
                    if [[ $? == 1 ]]; then
                        git -C $parent pull
                        git -C $parent push
                    fi
                fi
            ) &
        fi
    done
    wait
}

但是,当我运行它时,git 会要求输入用户名:

“https://github.com”的用户名:

以下是我所做的测试,以确保 git 可以访问 GitHub:

  • ssh -T [email protected]=> 成功
  • sudo -i+ => 成功ssh -T [email protected]
  • 我进入 git 存储库,更改一些内容,然后手动添加 + 提交 + 推送 => 成功
  • 我回到我的家,并使用-C another_git_repo_path=>成功从另一个存储库添加+提交+推送

那么为什么当我从脚本内部运行它时它不起作用?

答案1

如果您使用ssh身份验证来处理 git 存储库(以及 make pullpush等),则必须将每个存储库配置为使用ssh身份验证而不是https,否则 git 命令将继续询问您的用户和密码。

要将存储库身份验证更改为,ssh您可以使用以下命令:

  1. git remote set-url origin [email protected]:UserName/Repo.git
  2. 或者在.git/config文件中您可以将其行更改url = https://github.com/为:url = [email protected]:....
$> cat .git/config

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        url = [email protected]:UserName/Repo.git # edited line
        fetch = +refs/heads/*:refs/remotes/origin/*

相关内容