.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-base
1.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 규칙을 만들 수 있을 것으로 보입니다.
rsync
man 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
'programing' 카테고리의 다른 글
spring boot application에서 탄력적인 검색 쿼리를 표시하는 방법 (0) | 2023.10.21 |
---|---|
강제 "자화" 방향 모드 (0) | 2023.10.21 |
MySQL 보기 및 인덱스 사용 (0) | 2023.10.21 |
XAMPP 및 워드프레스 - 느린 로딩 (0) | 2023.10.21 |
electron - node.js - ng : 파일 경로\ng.ps1이 이 시스템에서 실행 중인 스크립트가 사용되지 않도록 설정되어 있으므로 로드할 수 없습니다. (0) | 2023.10.21 |