나는 많은 수의 파일을 포함하는 git 추적 저장소를 개발했습니다. 이 코드는 원격 시스템에서 실행되어야 합니다. 따라서 로컬에서 변경 사항을 적용할 때마다 이를 원격 장치와 동기화하고 원격 컴퓨터에서 새 코드를 실행해야 합니다.
수동 동기화 단계를 없애고 싶습니다. 내가 시도한 것들:
- 단순히 작업을
git push
(로컬) 및git pull
(원격) 수행하면 작동하지만 쓸모없는 커밋이 많이 발생합니다. 또한 때로는 구현하고 싶지 않은 작은 변경을 시도합니다. - 원격 디렉터리를 로컬로 마운트하면
sshfs
작동하지만 파일 액세스에 약간의 지연이 있습니다. 상관없지만 PyCharm이 이에 의존하고 있어 많은 기능이 손상되었습니다.
이를 달성하는 더 좋은 방법이 있습니까?
답변1
결국 두 가지 해결책을 찾았습니다.
- 사용
unison
. 이것은 원격 서버의 로컬 디렉터리를 미러링하기 위한 명령줄 유틸리티입니다. 많은 파일을 작업할 때와 비슷rsync
하지만 더 복잡하고 인체공학적입니다. 그들의github 저장소상당히 활동적이지만 웹페이지에는 개발이 대부분 중단되었다고 나와 있지만 주요 단점은unison
백그라운드에서 실행되는 유틸리티가 아니라 한 번만 실행되는 유틸리티라는 점입니다.cron
주기적으로 실행하는 것과 같은 기능을 사용할 수 있지만unison
이로 인해 긴 동기화 지연(1분 이상)이 발생하는지 그리고 수동 충돌 해결이 어떻게 작동하는지 잘 모르겠습니다. - 사용
lsyncd
. 이 프로그램은 내 사용 사례에 맞게 설계되었습니다. 특정 디렉터리를 지속적으로 모니터링하고 모든 변경 사항을 단 1초 만에 즉시 동기화합니다. 그러나 마지막 커밋은 2년 전이므로 장기적으로 얼마나 실행 가능한지는 잘 모르겠습니다.
lsyncd
계속해서 실행되기 때문에 결국 사용하게 되었습니다 . 의 경우 , 어떤 디렉터리를 어디서 어떻게 동기화할지(예: 특정 파일을 무시할지 여부)를 lsyncd
알려주는 Lua 파일인 "구성 파일"을 제공해야 합니다 . lsyncd
다음 구성 파일을 사용했습니다.
settings {
nodaemon = true,
statusInterval = 1
}
sync {
default.rsync,
source = "/home/donentolon/github/my-awesome-codebase",
target = "remote-machine:/home/remote-user/my-awesome-codebase",
delay = 1,
exclude = { '/.git', '/.idea' }
}
이는 lsyncd
우리에게 다음을 알려줍니다.
- SSH를 사용하여 원격 시스템에 연결합니다( 연결
config
하도록 SSH를 설정했습니다 ).ssh remote-machine
- 실제 동기화를 위해 rsync 사용
- 적어도 초당 한 번씩 파일 변경 사항을 확인하십시오(
delay
). - 최상위 git 및 PyCharm 파일을 동기화하지 않음
컴퓨터를 켤 때 터미널을 열고 실행하면 실행이 lsyncd my-lsyncd-profile.lua
시작되고 현재 수행 중인 작업에 대한 실시간 업데이트가 인쇄됩니다. 나는 터미널을 열어두고 lsyncd
하루가 끝나면 작업을 개발하고 완료합니다.
나는 원격 디렉토리의 변경 사항을 추적하기 위해 git을 사용하지 않습니다. git에 변경 사항을 커밋하려면 git commit
로컬 컴퓨터에서 lsyncd
동기화 하는 다른 명령을 실행합니다.~에서. 로컬 디렉터리는 실제로 로컬 디렉터리이고 로컬에 설치된 원격 디렉터리가 아니기 때문에 인덱싱과 같은 PyCharm 기능이 제대로 작동합니다.
백그라운드 모드가 있지만 상태 확인을 좋아해서 사용하지 않습니다 lsyncd
. 표준 Linux 방법을 사용하여 자동으로 시작되도록 구성할 수 있지만 저는 수동 방법을 선호합니다.
lsyncd
이 페이지에는 유사한 사용 사례의 몇 가지 대안이 나열되어 있으므로 이 솔루션이 마음에 들지 않으면 해당 솔루션을 살펴볼 수 있습니다.
답변2
당신은 시도 할 수 있습니다syncthing
. 잘 지원되고 잘 발달된 것처럼 보입니다. 지금까지 별표 48,900개, 커밋 7009개, 기여자 284명이 있습니다.
처음 알게 된 곳은 다음과 같습니다.https://hackaday.com/2020/07/23/linux-fu-keep-in-sync/
저는 자체 연속 동기화 도구를 개발 중입니다. 이 도구 gsync
는 현재 비동기식이며 수동으로 호출되는 스크립트입니다.sync_git_repo_from_pc1_to_pc2.sh
. 여기에서 내 디자인 노트 중 일부를 읽을 수 있습니다 gsync
.https://github.com/ElectricRCAaircraftGuy/eRCaGuy_dotfiles/issues/24
답변3
이 사용 사례는 실제로 매우 일반적입니다(특히 임베디드 개발에서). 앞서 언급한 것처럼 때로는 로컬 컴퓨터에 애플리케이션을 실행할 수 있는 올바른 환경이 없는 경우가 있기 때문입니다.
대부분의 IDE에는 "원격 실행" 기능이 있지만 저는 PyCharm을 사용해 본 경험이 없습니다. 바라보다여기특히 PyCharm용입니다.
환경에 구애받지 않는 또 다른 접근 방식은 파일을 사용 scp
하거나 rsync
전송/동기화한 다음 원격으로 실행하는 것입니다.
이것이 제대로 작동하려면 호스트에서 대상으로 SSH 공개 키 인증을 구성해야 합니다.ssh-copy-id user@target
그런 다음 이와 같은 스크립트를 사용하여 폴더를 원격으로 전송할 수 있으며 전송이 성공하면 몇 가지 명령을 실행하십시오.
#!/bin/bash
TARGET="<your-remote-here>";
USER="<your-user-name-on-remote-here>";
FOLDER_TO_TRANSMIT="<folder-to-transmit>";
FOLDER_TO_TRANSMIT_TO="<folder-path-on-target>";
REMOTE_COMMANDS="touch ~/testdir/z; ls ~/testdir;"
#transmit only (inefficiant, transmits everything, every time)
#scp -r $dir_to_transmit $USER@$TARGET:$FOLDER_TO_TRANSMIT_TO;
rsync -rv --delete $dir_to_transmit $USER@$TARGET:$FOLDER_TO_TRANSMIT_TO
if [ $? -eq 0 ]
then
ssh -t $USER@$TARGET "$REMOTE_COMMANDS"
fi
이 설정에서 걱정해야 할 유일한 것은 매번 전송하는 폴더를 적절하게 정리하는 것입니다. (rsync: --delete
소스 폴더에 존재하지 않는 모든 항목은 대상 폴더에서도 삭제됩니다. 이는 제외 모드로 피할 수 있습니다.) (scp: 해당되는 경우 예를 들어 원하는 경우 전체 원격 폴더를 삭제할 수 있습니다)
설정이 좀 더 복잡하다면 매번 전송하는 스크립트를 만든 다음 해당 스크립트를 호출할 수도 있습니다.