137

Rsync には--cvs-exclude「CVS と同じようにファイルを無視する」ための気の利いたオプションが含まれていますが、CVS は何年も前から廃止されています。最新のバージョン管理システム (Git、Mercurial、Subversion) によって無視されるファイルも除外する方法はありますか?

たとえば、GitHub からチェックアウトした多数の Maven プロジェクトがあります。通常、それらには、.gitignore少なくともtargetデフォルトの Maven ビルド ディレクトリ (トップ レベルまたはサブモジュールに存在する可能性があります) のリストが含まれます。これらのディレクトリの内容は完全に使い捨てであり、ソース コードよりもはるかに大きくなる可能性があるため、バックアップに rsync を使用する場合はそれらを除外したいと考えています。

もちろん、私は明示的にできます--exclude=target/が、たまたま名前が付けられtarget、無視されるべきではない無関係なディレクトリを誤って抑制してしまいます。

.gitignoreまた、ディスク上の任意の 、.hgignore、またはプロパティで言及されているすべてのファイル名とパターンの絶対パスの完全なリストを提供することもできますsvn:ignoreが、これはある種のスクリプトで作成する必要がある膨大なリストになります。

rsync には CVS 以外の VCS チェックアウトのサポートが組み込まれていないため、無視パターンを与えるための良いトリックはありますか? または、特定のファイル/ディレクトリを含めるかどうかをユーザースクリプトに尋ねることができる、ある種のコールバックシステムですか?

更新: LordJavac が示唆するように、少なくとも私が見つけた例では、CVS--filter=':- .gitignore'と同様に Git でも機能するようですが、構文が完全に一致しているかどうかは不明です。Mercurial ではうまく機能しません。たとえば、(Git に相当する Mercurial の) のような行を含む は、rsync によって正規表現として認識されません。また、Subversion では何も機能しないようです。この場合、1.6 以前の作業コピーを解析する必要があり、1.7 以降の作業コピーを取得するには落胆して手を投げ出さなければなりません。--filter=:C--filter=':- .hgignore'.hgignore^target$/target/.svn/dir-prop-base

4

13 に答える 13

146

ルクサンが述べたように、に--filter切り替えることでこれを行うことができますrsync。私はこれを達成しました--filter=':- .gitignore'(「.gitignore」の前にスペースがあります)。これは、ファイルとrsyncのディレクトリマージを実行し、.gitignoregitのルールに従ってそれらを除外するように指示します。グローバル無視ファイルがある場合は、追加することもできます。使いやすくするためにrsync、フィルターを含むエイリアスを作成しました。

于 2013-03-12T22:48:15.263 に答える
13

を使用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>
于 2016-03-10T21:21:30.063 に答える
13

何時間もの調査の後、まさに必要なものを見つけました。宛先フォルダーをソースフォルダーと同期し(ソースで削除された場合は宛先のファイルも削除します)、無視されたファイルを宛先にコピーしないでくださいによって.gitignoreまた宛先でこのファイルを削除しないでください:

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

つまり、このコマンドは、 source と destination の両方で .gitignore からのファイルを完全に無視します。フォルダも--exclude='/.git'コピーしたい場合は、一部を省略できます。.git

ソースからファイルをコピーする必要があります。.gitignoreLordJavac のコマンドを使用する場合、 は.gitignoreコピーされません。また、宛先フォルダにファイルを作成すると、それは によって無視され.gitignoreますが、このファイルは にもかかわらず削除されます.gitignore.gitignoreこれは、宛先に -filesがないためです。ただし、これらのファイルがある場合、に記載されているファイルは.gitignore削除されず、無視されますが、当然のことです。

于 2020-08-16T15:13:40.380 に答える
3

水銀の場合は、使用する可能性があります

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

.hgignore制限のために水銀の制御下にないファイルのリストを収集してから実行します

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

無視されたファイルを除くすべてのファイルをrsyncします。hg status -iはディレクトリではなく除外されたファイルのみをリストするため、空のディレクトリを同期から除外する rsync の-mフラグに注意してください

于 2016-12-27T21:00:18.997 に答える
2

非常に大きなファイルが多数あり.gitignore、「純粋なrsync」ソリューションはどれも機能しませんでした。私はこのrsync ラッパー スクリプト.gitignoreを作成しました。これはルールを完全に尊重し (サブディレクトリ内の!スタイルの例外と.gitignoreファイルを含める)、私にとって魅力的なように機能します。

于 2015-09-23T22:01:33.690 に答える
1

rsync(1) の MERGE-FILES FILTER RULES セクションを確認してください。

ディレクトリ構造をトラバースするときに .gitignore ファイルを含む rsync --filter ルールを作成できるようです。

于 2012-12-09T11:46:19.340 に答える
1

man ページによるrsyncと、ファイル パターンの標準リストに加えて、次のようになります。

$HOME/.cvsignore にリストされているファイルがリストに追加され、CVSIGNORE 環境変数にリストされているすべてのファイルが追加されます。

したがって、私の $HOME/.cvsignore ファイルは次のようになります。

.git/
.sass-cache/

.git とSassによって生成されたファイルを除外します。

于 2013-07-15T13:49:42.637 に答える
0

除外フィルターを作成する代わりに、git ls-filesrsync する各ファイルを選択するために使用できます。

#!/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改行で区切られたパスを返す場合でも機能します。ファイル名にスペースを含むバージョン管理されたファイルがある場合、おそらく機能しません。

于 2016-11-02T16:02:38.477 に答える