rsync 제외 .gitignore & .hgignore & svn : ignore like –filter = : C 포함되어 있지만 CVS는 수년 동안 사용되지

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에 의해 생성 된 파일을 제외합니다 .