Rsync에는 --cvs-exclude
“CVS와 동일한 방식으로 파일을 무시” 할 수 있는 멋진 옵션 이 포함되어 있지만 CVS는 수년 동안 사용되지 않았습니다. 최신 버전 제어 시스템 (Git, Mercurial, Subversion)에서 무시되는 파일을 제외 할 수있는 방법이 있습니까?
예를 들어 GitHub에서 많은 Maven 프로젝트를 체크 아웃했습니다. 일반적으로 .gitignore
최소한 target
기본 Maven 빌드 디렉토리 (최상위 또는 하위 모듈에있을 수 있음) 목록을 포함합니다. 이 디렉토리의 내용은 완전히 폐기 가능하고 소스 코드보다 훨씬 클 수 있으므로 백업에 rsync를 사용할 때 제외하고 싶습니다.
물론 명시 적으로 할 수는 --exclude=target/
있지만 이름이 지정 target
되고 무시되지 않아야 하는 관련없는 디렉토리를 실수로 억제 합니다.
그리고 나는 어떤에서 언급 된 모든 파일 이름과 패턴에 대한 절대 경로의 전체 목록을 제공 할 수 있습니다 .gitignore
, .hgignore
또는 svn:ignore
내 디스크의 특성,하지만이 스크립트의 일종으로 생산되어야 할 것이다 거대한 목록이 될 것입니다.
rsync에는 CVS 이외의 VCS 체크 아웃에 대한 내장 지원이 없기 때문에 무시 패턴을 제공하는 좋은 트릭이 있습니까? 아니면 사용자 스크립트가 주어진 파일 / 디렉토리를 포함해야하는지 여부를 물을 수있는 일종의 콜백 시스템입니까?
업데이트 : --filter=':- .gitignore'
LordJavac에서 제안한 것처럼 --filter=:C
구문이 정확히 일치하는지 확실하지 않지만 적어도 내가 찾은 예제에서는 CVS와 마찬가지로 Git에서도 작동하는 것 같습니다 . --filter=':- .hgignore'
Mercurial에서는 잘 작동하지 않습니다. 예를 들어 (Git의 Mercurial에 해당 .hgignore
하는) 라인을 포함하는 것은 rsync에 의해 정규 표현식으로 인식되지 않습니다. 그리고 Subversion에서는 작동하지 않는 것 같습니다 . 1.6 이전의 작업 복사본에 대해서는 구문 분석해야 하고 1.7 이상의 작업 복사본에 대해서는 당황스럽게 손을 내 밀어야합니다.^target$
/target/
.svn/dir-prop-base
답변
luksan이 언급했듯이 --filter
스위치를 rsync
. 나는 이것을 달성 --filter=':- .gitignore'
알려줍니다 ( “.gitignore”앞에 공백있다) rsync
와 디렉토리 병합 할 .gitignore
파일과 그들이 자식의 규칙에 따라 제외 가지고가. 전역 무시 파일이있는 경우 추가 할 수도 있습니다. 더 쉽게 사용할 수 있도록 rsync
필터가 포함 된 별칭을 만들었습니다 .
답변
git ls-files
저장소의 .gitignore
파일 에서 제외 된 파일 목록을 작성하는 데 사용할 수 있습니다 .
https://git-scm.com/docs/git-ls-files
옵션 :
--exclude-standard
모든.gitignore
파일을 고려 하십시오.-o
단계적이지 않은 변경 사항을 무시하지 마십시오.-i
무시 된 파일 만 출력합니다.--directory
전체 디렉토리가 무시되는 경우에만 디렉토리 경로를 출력하십시오.
내가 무시할 유일한 것은 .git
.
rsync -azP --exclude=.git --exclude=`git -C <SRC> ls-files --exclude-standard -oi --directory` <SRC> <DEST>
답변
방법은 rsync --exclude-from='path/.gitignore' --exclude-from='path/myignore.txt' source destination
?
그것은 나를 위해 일했습니다.
나는 당신도 더 많은 --exclude-from
매개 변수를 가질 수 있다고 믿습니다 .
답변
2018 년 솔루션 확인
rsync -ah --delete
--include .git --exclude-from="$(git -C SRC ls-files \
--exclude-standard -oi --directory >.git/ignores.tmp && \
echo .git/ignores.tmp')" \
SRC DST
세부 정보 : --exclude-from
목록을 제외하는 대소 문자가 인수로 구문 분석되지 않을 가능성이 있으므로 –exclude 대신 필수입니다. 에서 제외하려면 파일이 필요하며 파이프로 작업 할 수 없습니다.
현재 솔루션은 제외 파일을 .git 폴더 안에 저장하여 git status
자체 포함 상태로 유지하면서 영향 을 미치지 않도록합니다. 원한다면 / tmp를 사용할 수 있습니다.
답변
들어 수은 당신이 사용할 수
hg status -i | sed 's/^I //' > /tmp/tmpfile.txt
.hgignore 제한으로 인해 수은으로 통제되지 않는 파일 목록을 수집 한 다음 실행
rsync -avm --exclude-from=/tmp/tmpfile.txt --delete source_dir/ target_dir/
무시 된 파일을 제외한 모든 파일을 재 동기화합니다. 공지 사항 -m 동기화에서 빈 디렉토리를 제외됩니다 rsync와의 플래그 때문에 HG 상태 -i 것 만 나열 제외 된 파일이 아닌 DIRS
답변
이 시도:
rsync -azP --delete --filter=":- .gitignore" <SRC> <DEST>
‘.gitignore’에있는 파일을 제외한 모든 파일을 원격 디렉터리에 복사하고 현재 디렉터리에없는 파일을 삭제할 수 있습니다.
답변
당 rsync
맨 페이지, 파일 패턴의 표준 목록에 추가 :
$ HOME / .cvsignore에 나열된 파일이 목록 및 CVSIGNORE 환경 변수에 나열된 모든 파일에 추가됩니다.
따라서 내 $ HOME / .cvsignore 파일은 다음과 같습니다.
.git/
.sass-cache/
.git 및 Sass에 의해 생성 된 파일을 제외합니다 .