git作为DVCS的强大功能之一就是可以不用中心server节点,直接在developers之间的host同步源码。这个好处有很多,比如可以想到的一个比较明显的好处就是:可以在code尚未ready的情况下,随意在host之间同步,方便协作开发。(试想一下,如果是传统的CVCS,比如SVN,在代码尚未ready的时候,将代码就提交的中心repo,那简直就是噩梦。不幸的是,如果你如果不借助诸如rsync之类的外部工具,你几乎根本没办法绕开中心仓库,因为他是链接dev之间的一座桥)
今天折腾了一下在自己的desktop和laptop之间同步code的具体设置,没想到还真没那么顺利。
- Desktop:git clone 了remote repo A, 并做了一些修改,但code尚未完全测试,不适合push回到remote repo。
- Laptop:同样git clone 了remote repo A,这时希望获得desktop的所有修改,在Laptop上继续进行开发。于是执行了下面的命令:
git remote add desktop user@desktop.domain:/desktop/repo/path/.git git checkout -b from-desktop # create a new branch to receive the modification from desktop git pull desktop from-desktop # fetch from the desktop and merge it to the branch from-desktop
杯具的是执行最后一步时,爆出了git-upload-pack command not found这种错误。所以git pull也根本没有成功。
从提示上看是找不到git-upload-pack, 估计是PATH中没有git-upload-pack所在的路径。因为git是公司统一的标准安装路径,用which git-upload-pack 查看了一下,在一个特殊的路径/company/set/path下。
上面的git remote add命令中没有指定git使用的协议,默认使用的就是ssh了。这样分析说明问题出在ssh远程执行命令上了。
从Laptop ssh到desktop上执行echo $PATH, 发现PATH中正常包括/company/set/path这个路径。
退出来之后,再通过ssh username@desktop.domain 'echo $PATH‘查看PATH变量,这时果然就不包括/company/set/path了。
问题基本上定位到了,就是因为这里的差异,但是为什么会有这样的差异呢?
在Desktop上的.bash_profile设置非常简单,就是下面这些,
if [ -f $HOME/.profile ]; then . $HOME/.profile fi if [ -f $HOME/.bashrc ]; then . $HOME/.bashrc fi
两者理论上都执行了这个配置文件,我的$HOME下只有.bashrc的配置(对PATH的若干设置和export就在.bashrc中,其中就包括/company/set/path),所以两者应该走了同样的路径,没道理,一个路径中有,一个路径中没有啊。
找了半天,终于在.bashrc的第一行注意到这一句
# If not running interactively, don't do anything [ -z "PS1" ] && return
恍然大悟,罪魁祸首啊!
Linux系统中一种常用的判断是否是交互shell的方式就是通过PS1变量,虽然还有其他的方式,不过现在.bashrc中是通过PS1来判断是否为interactive mode。
通过ssh协议登陆到Desktop上时,已经在Laptop上开启了一个tty终端,属于interactive mode, 所以上面的那行不会进入return逻辑,整个.bashrc会被执行完,于是PATH中包括了所有设置过的关键路径。(N多export的PATH都放在了.bashrc的末尾)
但是ssh username@desktop.domain 'command'这种是典型的non-interactive shell,所以虽然也执行了.bashrc文件,但是在一开始就直接进入了return逻辑返回了,所以文件底部的对PATH的export根本没有生效。于是,就有了开始杯具。
找到根本问题了,解决方案就有了,将必要的export PATH的声明,全部移到[ -z "PS1" ] && return 之前。保证在non-interactive mode下,PATH的设置也都会生效。
再次从Laptop上执行git pull desktop from-desktop,所有修改被成功merge到Laptop的from-desktop分支上,问题解决!
相关推荐
SSH协议连接远程服务器的java实现,运行稳定,性能极佳
本文主要介绍三种方法,在Mac下使用SSH连接远程Linux服务器。 方法一:使用终端 1.打开终端,点击新建远程连接 2.点击加号,然后添加自己服务器的IP地址 3.点击右侧的服务器,然后在下方输入用户名,选择最下方的 ...
ssh远程连接linux系统工具,免费,操作简单,命令行以及文件上传下载。本人用于远程云服务器,亲测很实用,推荐!!!
SSH连接远程服务器的一个简单的工程,里面包含代码示例以及相关jar包.还有Log4j的简单配置和相关jar包
远程连接服务器必备工具 SSH,远程连接,远程服务器,远程控制,ssh
Python – paramiko 模块远程执行ssh 命令 nohup 不生效的问题解决 1、使用 paramiko 模块ssh 登陆到 linux 执行nohup命令不生效 # 执行命令 def command(ssh_config, cmd, result_print=None, nohup=False): ssh ...
这是一个可以自定义参数的使用Ssh2连接远程服务器的连接池,比如目标服务器地址、名称和密码;自定义连接池参;还提供了两个工具类,来向目标服务器的指定路径下上传文件或下载文件
vscode连接远程ubuntu服务器,使用remote-ssh插件+连接问题解决
ssh工具 用于连接远程服务器 linux 系统 解压 安装即可使用
做深度学习的同学都知道,显卡资源还是比较昂贵的...这时,VSCode+SSH就可以在一定程度上解决这个问题。 总的来说,本文档手把手教你如何脱离向日葵、TeamViewer等远程软件,实现多人分别在自己的电脑上同时控制主机。
SSH客户端连接远程服务器
通过gateone的安装实现的web端的ssh远程连接linux技术
ssh远程连接其他主机并执行命令,只能执行少量命令。也可自行优化改进
连接Linux服务器工具SSH 3.2.9 方便快捷!
SSH连接,使用SSH连接到服务器的过程,
该文档主要用于设置SSH远程连接客户端编码的编码格式,使中文也可以正常显示。
远程连接服务器的两种方式,telnet和ssh两种,还提供了执行命令的接口
连接服务器操作: # -*- coding: utf-8 -*- import paramiko # 服务器相关信息,下面输入你个人的用户名、密码、ip等信息 ip = "" port = 22 user = "" password = "" ssh = paramiko.SSHClient
此文档简要介绍了Windows下远程SSH连接RHEL服务器的方法,包括shell连接,图形界面连接,ssh文件传输连接。 一、 文档内容 a) Xstart图形连接RHEL b) XShell连接RHEL c) SSH Secure File Transfer工具
此一键脚本适用于希望快速开启 Root 用户登录配置 SSH 远程连接的用户群体,可用于远程登录进入服务器进行操作、配置和维护,提高远程管理效率,方便快捷。目标是让用户通过简单的操作即可实现远程服务器管理,节省...