code

rsync 제외 .gitignore & .hgignore & svn : ignore like --filter = : C

codestyles 2020. 8. 22. 08:57
반응형

rsync 제외 .gitignore & .hgignore & svn : ignore like --filter = : C


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'에있는 파일을 제외한 모든 파일을 원격 디렉터리에 복사하고 현재 디렉터리에없는 파일을 삭제할 수 있습니다.


매우 큰 .gitignore파일이 많았지 만 "순수 rsync"솔루션 중 어느 것도 저에게 효과가 없었습니다. rsync 래퍼 스크립트를 작성했으며 .gitignore규칙 ( 하위 디렉터리에 !스타일 예외 및 .gitignore파일 포함)을 완전히 준수 하며 저에게 매력처럼 작동했습니다.


rsync (1)의 MERGE-FILES FILTER RULES 섹션을 확인하십시오.

It looks like it's possible to create a rsync --filter rule that will include .gitignore files as traverses the directory structure.


Per the rsync man page, in addition to the standard list of file patterns:

files listed in a $HOME/.cvsignore are added to the list and any files listed in the CVSIGNORE environment variable

So, my $HOME/.cvsignore file looks like this:

.git/
.sass-cache/

to exclude .git and the files generated by Sass.


Instead of creating exclude filters, you can use git ls-files to select each file to rsync:

#!/usr/bin/env bash

if [[ ! $# -eq 2 ]] ; then
    echo "Usage: $(basename $0) <local source> <rsync destination>"
    exit 1
fi

cd $1
versioned=$(git ls-files --exclude-standard)
rsync --verbose --links --times --relative --protect-args ${versioned} $2

This works even though git ls-files returns newline separated paths. Probably won't work if you have versioned files with spaces in the filenames.


Alternatives:

git ls-files -zi --exclude-standard |rsync -0 --exclude-from=- ...

git ls-files -zi --exclude-per-directory=".gitignore" |...

(rsync only partly understands .gitignore)

참고URL : https://stackoverflow.com/questions/13713101/rsync-exclude-according-to-gitignore-hgignore-svnignore-like-filter-c

반응형

'code' 카테고리의 다른 글

R에서 예외 처리  (0) 2020.08.22
Mongo 인터페이스  (0) 2020.08.22
Hash Rocket은 더 이상 사용되지 않습니까?  (0) 2020.08.22
클래스와 유형의 차이점  (0) 2020.08.22
JVM이 테일 호출 최적화를 방지합니까?  (0) 2020.08.22