rsync를 사용하여 대상에서 선택한 파일을 삭제하지 않고 웹 사이트 배포를 위한 소스 미러링

rsync를 사용하여 대상에서 선택한 파일을 삭제하지 않고 웹 사이트 배포를 위한 소스 미러링

며칠 동안 이 작업을 해왔는데 무슨 일을 하든 제대로 작동할 수 없습니다. StackExchange 네트워크에서 rsync에 대한 거의 모든 Q&A를 읽었지만 아직 답변을 찾지 못했습니다.

기본적으로 저는 소스 Git 저장소에서 대상으로 파일을 이동하기 위해 rsync를 사용하여 Git 저장소를 배포하는 웹 사이트 배포 도구를 작성하고 있습니다. 배포 저장소를 커밋하면 실제로 코드가 웹 서버에 배포되므로 rsync를 사용하여 서로 다른 두 디렉터리 사이를 지연시킵니다.

소스 저장소에서 개발자가 삭제한 모든 파일은 배포 저장소에서도 삭제되는 것이 매우 중요합니다. 그러나 배포 저장소에는 필요한 일부 선택된 파일이 있습니다.아니요특히 이러한 파일은 호스팅 공급자가 제공하고 프로덕션에 필요하지만 소스 저장소에서 유지 관리하는 데 문제가 있습니다.

여기와 다른 곳에서 읽은 내용에 따르면 man배포/대상 저장소에 보관하려는 파일 이름을 --exclude-from추가 하면

기본적으로 제가 하는 일은 다음과 같습니다.

rsync --archive --verbose \
      --exclude ".git" --exclude ".git*" \
      --exclude-from="/tmp/excludes.txt" --delete-after \
      /dir/to/source/repo/ \
      /dir/to/deploy/repo

예시를 위해 다음과 같다고 가정해 보겠습니다 /tmp/excludes.txt.

/foo/bar/baz.php

이제 간단한 예제를 사용하여 로컬에서 이것을 시도하면 항상 예상대로 작동하는 것 같습니다. 하지만 실제 배포 시나리오에서 CircleCI와 함께 사용하면 위 명령을 실행한 후 항상 삭제됩니다 rsync./foo/bar/baz.php

내가 뭘 잘못하고 있는지 알 수 있나요? 미리 감사드립니다.

업데이트 - 위의 내용은 실제로 작동합니다.

CircleCI에서 실행 중인 스크립트의 논리에 문제가 있는 것으로 나타났지만 볼 수 없습니다. 다른 루트를 사용하여 여러 rsync 명령을 실행하고 있습니다.(본질적으로 내 기본 루트의 하위 디렉터리)다양한 규칙과 기본 루트를 기반으로 하는 모든 파일 경로를 포함하는 제외된 파일 목록이 필요하기 때문입니다. 아.

어쨌든, 친애하는 독자 여러분, 위의 예는 제가 원하는 작동 방식을 설명한 대로 정확하게 작동한다는 것이 밝혀졌습니다.

답변1

루프를 끝내기 위해, 이 글을 읽는 사람이 rsync를 사용하여 대상 디렉터리를 소스 디렉터리로 미러링하는 방법을 궁금해하는 경우특별히 이름이 지정된 파일을 제외하고이것이 당신이 하는 일입니다:

rsync --archive --verbose \
      --exclude-from="/tmp/excludes.txt" --delete-after \
      /dir/to/source/repo/ \
      /dir/to/deploy/repo

/tmp/excludes.txt파일의 전체 파일 경로가 지정된 내용은 다음과 같습니다 /dir/to/deploy/repo/foo/bar/baz.php.

/foo/bar/baz.php

관련 정보