programing

.gitignore & .hgignore & svn에 따라 rsync 제외: --filter=:C와 같은 ignore

lovejava 2023. 10. 21. 09:48

.gitignore & .hgignore & svn에 따라 rsync 제외: --filter=:C와 같은 ignore

Rsync에는 적절한 옵션이 포함되어 있습니다.--cvs-exclude"으로 파일을 무시는 수년 사용되지 CVS가 하는 것과 같은 방식으로 파일을 무시"하지만, CVS는 수년 동안 사용되지 않았습니다.현대 버전 제어 시스템(Git, Mercurial, Subversion)에서 무시되는 파일도 제외할 수 있도록 하는 방법이 있습니까?

예를 들어, 저는 GitHub에서 메이븐 프로젝트를 많이 체크아웃했습니다.일반적으로 다음을 포함합니다..gitignore최소한 나열하기target, 기본 메이븐 빌드 디렉토리(상위 레벨 또는 하위 모듈에 존재할 수 있음).이러한 디렉토리의 내용은 전적으로 일회용이며, 소스 코드보다 훨씬 클 수 있기 때문에 백업에 rsync를 사용할 때는 제외하고 싶습니다.

물론 나는 분명히 할 수 있습니다.--exclude=target/하지만 그렇게 되면 우연히 이름이 지어지는 관련 없는 디렉토리를 억제하게 될 것입니다.target무시해서는 안 됩니다

그리고 모든 파일 이름과 패턴에 대한 완전한 경로 목록을 제공할 수 있었습니다..gitignore,.hgignore, 아니면svn:ignore내 디스크에 있는 속성이지만, 이것은 일종의 스크립트에 의해 생성되어야 할 거대한 목록이 될 것입니다.

rsync는 CVS 외에 VCS 체크아웃을 기본 지원하지 않는데 무시 패턴을 제공할 수 있는 좋은 방법이 있습니까?아니면 사용자 스크립트가 주어진 파일/디렉토리를 포함해야 하는지 아닌지를 물어볼 수 있는 일종의 콜백 시스템?

업데이트:--filter=':- .gitignore'Javac 경이 제안한 대로 Gitas에게도 효과가 있는 것 같습니다.--filter=:C구문이 정확하게 일치하는지는 불분명하지만, 적어도 제가 찾은 예에 대해서는 CVS에 대해 그렇게 합니다.--filter=':- .hgignore'Mercurial에 대해 매우 잘 작동하지 않습니다; 예를 들어..hgignore등의 선을 포함하여^target$의)/target/는 rsync에서 정규식으로 인식되지 않습니다.그리고 Subversion에 대해서는 아무것도 통하지 않는 것 같아요. 당신이 분석해야 할 것입니다..svn/dir-prop-base1.6 또는 그 이전의 작업 복사본의 경우, 그리고 1.7 또는 그 이후의 작업 복사본의 경우 실망하여 손을 들어 올립니다.

Luksan님이 말씀하신 것처럼, 여러분은 이것을 할 수 있습니다.--filter로 바꾸다rsync. 저는 이 일을 해냈습니다.--filter=':- .gitignore'(".gitignore" 앞에 공간이 하나 있는데, 그것은rsync디렉토리 병합을 하다.gitignore파일을 저장하고 퍼짓의 규칙을 제외하도록 합니다.전역 무시 파일이 있는 경우 추가할 수도 있습니다.좀 더 쉽게 사용할 수 있도록 하기 위해 에일리어스를 만들었습니다.rsync필터가 포함되어 있습니다.

몇 시간의 연구 끝에 나는 대상 폴더를 원본 폴더와 동기화하고(소스에서 파일이 삭제된 경우 대상에 있는 파일도 삭제), 대상에 무시되는 파일을 복사하지 않는 것과 같은 내가 정확히 필요한 것을 발견했습니다..gitignore, 또한 대상에서 이 파일을 삭제하지 않습니다.

rsync -vhra /source/project/ /destination/project/ --include='**.gitignore' --exclude='/.git' --filter=':- .gitignore' --delete-after

다시 말해, 이 명령어는 소스와 대상 모두에서 .gitignore의 파일을 완전히 무시합니다.생략가능합니다--exclude='/.git'복사하려면 part..git폴더도 있습니다.

복사해야 합니다..gitignore원본 파일을 저장할 수 있습니다.당신이 자바크 경의 명령을 사용한다면,.gitignore복사되지 않습니다.그리고 만약 당신이 대상 폴더에 파일을 만든다면, 그것은 무시되어야 합니다..gitignore, 그럼에도 불구하고 이 파일은 삭제됩니다..gitignore. 왜냐하면 당신은 당신이 가지고 있지 않기 때문입니다..gitignore대상에 파일이 있습니다.하지만 이 파일들을 가지고 있다면, 그 파일들은.gitignore삭제되지 않고 무시됩니다. 예상한 것뿐입니다.

사용가능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>

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를 사용해도 좋습니다.

는 ?rsync --exclude-from='path/.gitignore' --exclude-from='path/myignore.txt' source destination?
그것은 나에게 효과가 있었다.
당신은 더 많은 것을 가질 수 있다고 믿습니다.--exclude-from매개 변수도 있습니다.

나는 많은 수의 매우 큰 것들을 가지고 있었습니다..gitignore파일들과 "순수한 rsync" 솔루션들 중 어떤 것도 저에게 효과가 없었습니다.rsync 포장지 스크립트를 작성했습니다. 충분히 존중합니다..gitignore규칙()!- 스타일 예외 및.gitignore서브디렉토리에 있는 파일)을 사용하고 있습니다. 그리고 저에게 매력적으로 작용했습니다.

사용할 수 있는 수은.

hg status -i | sed 's/^I //' > /tmp/tmpfile.txt

.hgignore 제한으로 인해 mercurial control에 속하지 않는 파일의 목록을 수집한 다음 실행합니다.

rsync -avm --exclude-from=/tmp/tmpfile.txt --delete source_dir/ target_dir/

무시된 파일을 제외한 모든 파일을 rsync합니다.hg status가 아닌 제외된 파일만 나열하므로 빈 디렉터리를 동기화에서 제외하는 rsync에서 notice -m 플래그를 지정합니다.

시도해 보기:

rsync -azP --delete --filter=":- .gitignore" <SRC> <DEST>

'gitignore'에 있는 파일을 제외한 모든 파일을 원격 디렉토리에 복사할 수 있으며, 현재 디렉토리에 없는 파일도 삭제할 수 있습니다.

rsync(1)의 MERGE-FILES FIRLD RUules 섹션을 확인합니다.

디렉토리 구조를 횡단할 때 .gitignore 파일을 포함하는 arsync --filter 규칙을 만들 수 있을 것으로 보입니다.

rsyncman page, 파일 패턴의 표준 목록과 함께:

$HOME/.cvsignore에 나열된 파일이 목록에 추가되고 CVSSIGNORE 환경 변수에 나열된 모든 파일이

따라서 $HOME/.cvsignore 파일은 다음과 같습니다.

.git/
.sass-cache/

.git와 Sass에 의해 생성된 파일을 제외합니다.

대안:

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

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

(rsync는 .gitignore를 부분적으로만 이해합니다.)

단답형

rsync -r --info=progress2 --filter=':- .gitignore' SOURCE DEST/

매개변수의 의미:

-r: 재귀적

--info=...: 진전을 보다

--filter=...: .gitignore 파일에 나열된 규칙으로 제외합니다.

제외 필터를 만드는 대신 다음을 사용할 수 있습니다.git ls-files각 파일을 선택하려면 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

이것은 비록 효과가 있습니다.git ls-files줄로 구분된 새 경로를 반환합니다.파일 이름에 공백이 있는 버전 파일이 있는 경우에는 작동하지 않을 수 있습니다.

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