SSH 가 원 격 서버 에 연결 하여 command 를 직접 실행 할 때 PATH 설정 이 완전 하지 않 은 솔 루 션

3629 단어 command
git 는 DVCS 의 강력 한 기능 중 하나 로 서 중심 server 노드 를 사용 하지 않 고 developers 간 의 host 동기 화 소스 코드 를 직접 사용 할 수 있다 는 것 이다.이 장점 은 매우 많다. 예 를 들 어 생각 할 수 있 는 비교적 뚜렷 한 장점 은 바로 code 가 준비 되 지 않 은 상황 에서 host 간 에 마음대로 동기 화하 고 합작 개발 을 편리 하 게 할 수 있다 는 것 이다.(전통 적 인 CVCS, 예 를 들 어 SVN 이 코드 가 준비 되 지 않 았 을 때 코드 를 제출 하 는 중심 repo 라면 악몽 입 니 다. 불행 하 게 도 rsync 와 같은 외부 도 구 를 빌 리 지 않 으 면 중심 창 고 를 돌아 갈 수 없습니다. dev 사 이 를 연결 하 는 다리 이기 때 문 입 니 다)
오늘 은 자신의 desktop 과 laptop 사이 에서 코드 를 동기 화 하 는 구체 적 인 설정 을 괴 롭 혔 는데 그렇게 순 조 롭 지 못 할 줄 은 몰 랐 다.
  • Desktop: git clone 은 reote repo A 를 수정 하 였 으 나, code 는 아직 완전히 테스트 되 지 않 았 으 며, push 가 reote repo 로 돌아 가 는 데 적합 하지 않 습 니 다.
  • Laptop: 마찬가지 로 git clone 은 reote repo A 를 원 합 니 다. 이때 desktop 의 모든 수정 을 받 아 Laptop 에서 계속 개발 하고 싶 습 니 다.그래서 다음 명령 을 실 행 했 습 니 다.
    git remote add desktop [email protected]:/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 에서 특수 한 경로 / copany / set / path 에서 확인 하 였 습 니 다.
    위의 git reote add 명령 에는 git 가 사용 할 프로 토 콜 이 지정 되 어 있 지 않 습 니 다. 기본적으로 ssh 를 사용 합 니 다.이러한 분석 은 문제 가 ssh 원 격 실행 명령 에 있다 는 것 을 설명 한다.
    Laptop ssh 에서 desktop 까지 echo $PATH 를 실행 하 였 으 며, PATH 에는 / copany / set / path 라 는 경로 가 정상적으로 포함 되 어 있 음 을 발견 하 였 습 니 다.
    물 러 난 후 ssh 를 통과 합 니 다[email protected]'echo $PATH' 는 PATH 변 수 를 봅 니 다. 이 때 는 역시 / copany / set / path 를 포함 하지 않 습 니 다.
     
    문 제 는 기본적으로 이곳 의 차이 때 문 이라는 것 을 알 게 되 었 다. 그런데 왜 이런 차이 가 있 을 까?
    Desktop 에 있 는. bash프로필 설정 은 매우 간단 합 니 다. 바로 아래 에 있 는 것들 입 니 다.
           if [ -f $HOME/.profile ]; then
                   . $HOME/.profile
           fi
    
           if [ -f $HOME/.bashrc ]; then
                   . $HOME/.bashrc
           fi

     두 가지 이론 적 으로 모두 이 프로필 을 실 행 했 습 니 다. 제 $HOME 아래 에 'bashrc' 설정 만 있 습 니 다. (PATH 에 대한 약간의 설정 과 export 는 'bashrc' 에 있 습 니 다. 그 중에서 'copany / set / path' 를 포함 합 니 다. 그래서 두 가 지 는 똑 같은 경 로 를 가 야 합 니 다. 이치 에 맞지 않 습 니 다. 한 경로 에 있 습 니 다. 한 경로 에 없 습 니 다.
     
    한참 을 찾다 가 마침내. bashrc 의 첫 줄 에서 이 말 을 알 아 차 렸 다.
    # If not running interactively, don't do anything
    [ -z "PS1" ] && return

     문득 크게 깨 달 았 다, 원흉 이 야!
    Linux 시스템 에서 자주 사용 되 는 인 터 랙 티 브 셸 여 부 를 판단 하 는 방식 은 PS1 변 수 를 통 해 다른 방식 이 있 지만 현재 bashrc 에 서 는 PS1 을 통 해 인 터 랙 티 브 모드 인지 여 부 를 판단 하 는 것 입 니 다.
    ssh 프로 토 콜 을 통 해 Desktop 에 로그 인 했 을 때 Laptop 에 tty 터미널 을 열 었 습 니 다. interactive mode 에 속 하기 때문에 위의 줄 은 return 논리 에 들 어가 지 않 고 전체. bashrc 가 실 행 될 것 입 니 다. 그래서 PATH 에는 설 정 된 모든 관건 적 인 경로 가 포함 되 어 있 습 니 다.(N 다 export 의 PATH 는 모두. bashrc 의 끝 에 놓 여 있 습 니 다)
    하지만 [email protected]'command' 는 전형 적 인 non - inteactive shell 이기 때문에 'bashrc 파일' 도 실 행 했 지만 처음부터 return 논리 에 들 어가 되 돌 아 왔 기 때문에 파일 밑 에 있 는 PATH 에 대한 export 는 적용 되 지 않 았 습 니 다.그래서 시작 컵 이 생 겼 어 요.
     
    근본 적 인 문 제 를 찾 으 면 해결 방안 이 있 습 니 다. 필요 한 export PATH 의 성명 을 모두 [- z "PS1"] & & return 이전 으로 옮 깁 니 다.non - interactive mode 에서 도 PATH 설정 이 적 용 됩 니 다.
     
    Laptop 에서 git pull desktop from - desktop 을 다시 실행 합 니 다. 모든 수정 이 성공 적 으로 merge 되 어 Laptop 의 from - desktop 분기 에 문제 가 해결 되 었 습 니 다!

    좋은 웹페이지 즐겨찾기