.gitignore 구성으로 인해 git이 무시하는 모든 파일을 무시하면서 로컬 디렉터리를 가능한 원격 디렉터리와 동기화하기 위해 종종 rsync를 사용해야 합니다.
이를 위해 현재 git 복제와 관련된 모든 파일을 나열한 다음 rsync로 파이프합니다.
cd $source
{ git ls-files -coz --directory --exclude-standard
printf '.git\0'
} | rsync --info=progress2 -ar0 --files-from=- ./ "$destination"
구문 분석을 git 자체에 맡기고 파일 목록을 rsync로 파이핑하면 제가 의존하는 몇 가지 이점이 있습니다.
- 파일을 무시하는 패턴은 매우 복잡할 수 있으며
!inverse-pattern-to-include
rsync가 이 구문에서 이해하지 못하는 부정( )을 포함할 수 있습니다. .gitignore
또한 하위 디렉터리에 있는 파일도 고려하세요. Rsync의merge-dir
필터는 포함 및 제외 순서가 rsync에 중요하기 때문에 이것이 리팩토링되는 것을 정확히 허용하지 않습니다..git/info/exclude
전역 git 구성 파일도 고려됩니다.- git 저장소를 초기화하지 않고도 작동합니다. git을 사용하여 git 저장소를 가리키기만 하면 됩니다
--git-dir
. - 저장소는 매우 클 수 있으므로 모든 관련 파일을 rsync
--filter
--exclude
또는--include
모드로 지정하면 명령줄 제한이 깨지거나 rsync 속도가 심각하게 느려질 수 있습니다. 이는 을 사용하여--files-from
방지할 수 있습니다 .
이제 누락되거나 제외된 모든 파일을 --del
제거하기 위해 rsync 플래그를 지원하도록 이 코드 조각을 개선해야 합니다 . 불행히도 에서는 잘 재생되지 않습니다 . 양쪽 끝의 파일 목록을 다시 비교하지 않고도 가능합니까?$destination
$source
--files-from