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)
'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 |