2016-01-21 108 views
0

我做一些脚本:Git里,克隆与特定的私钥,sh.exe找不到文件

#!/bin/bash 

##### 
dest_branch="4.0.8_copy" 
source="sprint24_copy" 
##### 

dest=$dest_branch 
source=$source_branch 
startDir=`pwd` 
sshFile=$startDir"/git_ssh.ssh" 
gitrepo="<some valid repo adress>" 
git_key=$startDir"/key.ssh" 

sshKey="-----BEGIN RSA PRIVATE KEY----- 
MIIJJwIBAAKCAgEAs7Rfpca8s4.... and rest of key" 

echo $sshKey > $git_key 
echo "ssh -i "$git_key" \[email protected] "> $sshFile 

export GIT_SSH=$sshFile 
export GIT_TRACE=1 

git clone [email protected]$gitrepo -b $dest 

我运行混帐击(C这个脚本:\ Program Files文件\的Git \ BIN \ sh.exe ),并且该脚本失败,这一点错误:

Cloning into 'neos'... 
10:44:26.575804 run-command.c:343  trace: run_command: 'C:/Users/<some user>/Desktop/<some dir>/git_ssh.ssh' '[email protected]<some valid adress>' 'git-upload-pack '\''<some project>'\''' 
error: cannot spawn C:/Users/<some user>/Desktop/<some dir>/git_ssh.ssh: No such file or directory 
fatal: unable to fork 

我试图改变命令pwd静态路径,如C:/ ... C:/ .../C/... \ C。 C:... C:...但仍然表现不佳。可以anybady帮我具体的另一个私人密钥克隆git回购?为什么这个sh.exe看不到我的文件?我确定该文件存在。我使用git版本2.6.4.windows.1。感谢您的帮助,并对我的英语感到抱歉。

+1

从未在Windows上尝试过Git。对于bash的正常调试是将shebang更改为'#!/ bin/bash -x'并查看输出以验证所有内容都按预期进行了扩展。对于sshKey-assignment,可以查看heredocs来存储多行字符串,例如http://stackoverflow.com/questions/23929235/bash-multi-line-string-with-extra-space –

+0

使用'ssh_config' – Jakuje

回答

1

我尝试了解问题。我有一些观察。

我使用git.exe。 git.exe使用Windows路径,但MinGW使用两者,而ssh只使用linux:X

当我尝试使用GIT_SSH ='path to scrip'时,那么git使用了一些像ConvertToWindowsPatch(GIT_SSH)。最后git查找脚本,但现在SSH无法找到带有密钥的文件!

当我尝试GIT_SSH =“的ssh -vvv”调试我看到

bash: ssh: command not found 

首先我觉得跆拳道...但我看到,SSH是一个别名!所以我使用GIT_SSH ='ssh.exe -vvv',现在它工作。不幸的是,我无法解决我的问题,即ssh没有看到我的文件,但我知道,如果我将文件写入C:\,那么在C中这个文件不存在!该文件位于C:\ Users \\ AppData \ Local \ VirtualStore中。我不知道如何将我的ssh密钥保存在文件中,并且ssh可以看到它,但我有其他解决方法。

在我的脚本主要功能之前,我备份了.ssh文件夹。然后我写入.ssh中的id_rsa和known_host。然后我想要git clone,但是ssh问我关于密码的问题......但是这个密钥没有通过!!好吧冷静下来当我尝试ssh.exe -vvv时,我发现sshKey没有标题,因为我没有换行写这个键!我有这样的:

echo $sshKey > $sshKeyFile 

但正确的是

echo "$sshKey" > $sshKeyFile 

现在一切工作正常。我看到2个WTF - 第一个ssh在MinGW中看不到文件,第二个如果ssh在没有-vvv的情况下看不到密钥的标题,请不要看到这个,但询问pass(wtfwtfwtfwtfwtf ...)

这是正确的脚本来操作混帐回购(合并,推等...)在bash中使用MinGW,git和Windows,以及特定的rsa私钥。我用它来自动编写并在Windows上的Jenkins中创建分支。

#!/bin/bash 

##### 
dest_branch="4.0.8_copy" 
source="sprint24_copy" 
##### 

dest=$dest_branch 
source=$source_branch 
sshDir="/c/Users/<user>/.ssh" 
gitrepo="<repo>" 
sshKeyFile=$sshDir"/id_rsa" 
knownHostsFile=$sshDir"/known_hosts" 

sshKey="-----BEGIN RSA PRIVATE KEY----- 
MIIJKAIBAAKCAgEApH0bkaXa0z7811Sd1ZEG87adPPNWyaya47T3GrCjjnRvVyEk 
N8jGjh/..." 

knownHosts="<some host> ecdsa-sha2-nistp256 AAAAE2VjZ..." 

if [ -a $sshDir ] ; then 
    echo "backup .ssh" 
    cp -r $sshDir $sshDir"_back" 

    echo "usuwanie starego .ssh" 
    rm -r $sshDir 

    echo "tworzenie nowego .ssh" 
    mkdir $sshDir 

    echo "zapis klucza rsa" 
    echo "$sshKey" > $sshKeyFile 

    echo "zapis znanyn hostów" 
    echo $knownHosts > $knownHostsFile 

    echo "wlaczenie debugu gita" 
    export GIT_TRACE=2 

    echo "wlaczenie debugu 

    echo "clone repo" 
    git clone [email protected]$gitrepo -b $dest 
    #other git operations 

    echo "usuwanie tymczasowego .ssh" 
    rm -r $sshDir 

    echo "odtwrzanie z backupu .ssh" 
    cp -r $sshDir"_back" $sshDir 

    echo "usuwanie backupu" 
    rm -r $sshDir"_back" 
fi 

感谢您的帮助和评论!