我有一个在一台服务器上运行的php脚本,其中包含一个ssh命令的exec()到另一台服务器。该ssh命令运行包含git命令的脚本。在远程服务器上执行的远程文件中的git命令似乎正在影响发起ssh命令的服务器,使原始服务器停留在错误的git分支上。
我创建了两个脚本来最低限度地重现这个。第一个脚本git_ssh_bug_repro_1.php
打印出它的主机名和git分支,然后在另一台服务器(sudo ssh root@test-1 'php /path/git_ssh_bug_repro_2.php'
)和print_r&#39上运行第二个脚本的exec()&#s; ssh命令; s该输出,然后打印出其主机名和git分支之后的内容。第二个脚本也首先打印其主机名和当前分支,然后执行git checkout testing
,然后再打印出其主机名和分支。这两个脚本的输出如下所述一起运行:
root@abc-1:/path# php git_ssh_bug_repro_1.php
BEFORE running ssh command:
COMMAND: git rev-parse --abbrev-ref HEAD
Hostname: abc-1, current git branch: master
COMMAND: sudo ssh root@test-1 'php /path/git_ssh_bug_repro_2.php'
Password authentication is disabled to avoid man-in-the-middle attacks.
Keyboard-interactive authentication is disabled to avoid man-in-the-middle attacks.
Switched to branch 'testing'
OUTPUT:
Array
(
[0] => master
[1] => BEFORE running git checkout command:
[2] => COMMAND: git rev-parse --abbrev-ref HEAD
[3] => Hostname: test-1, current git branch: master
[4] => COMMAND: git checkout testing
[5] => OUTPUT:
[6] => Array
[7] => (
[8] => [0] => master
[9] => [1] => Your branch is ahead of 'origin/testing' by 21 commits.
[10] => )
[11] => AFTER running git checkout command:
[12] => COMMAND: git rev-parse --abbrev-ref HEAD
[13] => Hostname: test-1, current git branch: testing
)
AFTER running ssh command:
COMMAND: git rev-parse --abbrev-ref HEAD
Hostname: abc-1, current git branch: testing
root@abc-1:/path#
摘要:为什么一台服务器上的脚本运行的git命令会影响另一台服务器的git状态(在这种情况下,导致它切换到错误的分支),只是因为说脚本是通过ssh从其他服务器发出的?我怎么能不这样做,所以原始服务器的git分支没有被改变或以其他方式被篡改?
答案 0 :(得分:0)
是的,结果证明这是一个误报的问题。在两个有问题的服务器上,git repo目录通过符号链接到同一服务器上的相同位置。因此,当然更改一个分支也改变了另一个 - 它们是同一个目录。对于错位的问题道歉,并感谢任何花时间看这个问题的人。