2016-08-03 12 views
3

単一二つのファイル、abにコミットして簡単なテストリポジトリを考えると、私は特定のファイルのリストを取得することができます。gitアーカイブからファイルを除外するにはどうすればよいですか?

$ git ls-files a 
a 

または特定のファイルを除くすべてのファイルのリスト:

$ git ls-files . ':!b' 
a 

私は特定のファイルのアーカイブを作成することができます

$ git archive HEAD a | tar tf - 
a 

をしかし、私はのアーカイブを作成することはできません。特定のファイルを除くLLファイル:それは最大のコマンドライン引数の長さを超えるよう

$ git archive HEAD . ':!b' | tar tf - 
a 
b 

特定のファイルのアーカイブを使用するオプションは、私の本当のリポジトリに私のためのオプションではありません。

export-ignore属性で除外するファイルのリストを.gitattributesに保存できますが、リストは動的に生成されます。私は自動的にファイルを変更することができますが、変更は別のコミットの後まで選択されません。

別のコミットを必要とせずに動作する別の呼び出しがありますか?

答えて

5

の下に滞在するあなたのコマンドラインを分割することができ、このようにタールを作成し、

git archive HEAD -o archive.tar 
tar -f archive.tar --delete listoffiles1 
tar -f archive.tar --delete listoffiles2 
tar -f archive.tar --delete listoffiles.. 
tar -f archive.tar --delete listoffilesN 

内である必要はありませんフォルダやファイルを削除することができますあなたはそれをほとんど釘付けにしていると思う:属性はいくつかの場所から読み取ることができ、.gitattributesがそれらの中で最も一般的である。 2番目のもの—はリポジトリごとの構成とみなされます—は$GIT_DIR/info/attributesです。属性は、デフォルトでは、アーカイブされている ツリー内.gitattributesファイルから取られていることを

注:マニュアルを引用する

。事実の後に出力(例えば export-ignore.gitattributesに追加せずにコミットしたなど)の出力方法を微調整したい場合は、チェックアウトした.gitattributesファイル を調整して--worktree-attributesオプションを使用します。代わりに、 のファイルを $GIT_DIR/info/attributesファイル内の任意のツリーをアーカイブする際に適用する必要がある属性を保持することもできます。

可能であれば、そのファイルにリストを貼り付けてから、git archiveを実行します。

別のアプローチは、git archiveを使用する代わりに、単にtar作業ツリーは、ファイルを受け付けtar--exclude-fromコマンドラインオプションを渡していないことです。これは、裸のリポジトリでは機能しませんが、アーカイブ前にチェックアウトしても問題がない場合は、とgit checkout-indexに正しい​​と$GIT_WORK_TREEのenvを指定して実行できます。変数。

別の可能な回避策はアプローチを逆転さ:tar(少なくともGNU tarは)パイプラインのアーカイブからものを削除することができるというあまり知られてオプションをサポートしています。

秒1は*.pdfシェルグロブパッテンと一致するファイルを除いてすべてを通過する間パイプラインのアーカイブのすべての最初のtarように基本的に、あなたは

$ tar -C a_path -c -f - . \ 
    | tar -f - --wildcards --delete '*.pdf' >result.tar 

を行うことができます。

シェルglobを使用して削除するファイルを指定することがコマンドラインの制限に適合する場合は、git archiveの出力をtar prcocessにパイプして不要なものを削除してください。

+0

詳細な回答ありがとうございます。私は '.git/info/attributes'が必ずしも最も論理的なアプローチではないと思っていますが、私がすでに持っているものに最も適しています。将来何かが必要な場合は、' tar --delete' 。 – hvd

3

あなたは、私が最大のCLI引数の長さ

1

export-ignoreを(コミット済み).gitattributesに入れるのではなく、コミットされていない$GIT_DIR/info/attributesファイルに入れることもできます。あるいは、.gitattributesをコミットしておらず、--worktree-attributesオプションを使用してください。これは、作業ツリーを汚れてしまうので、それほどうれしくありません。

関連する問題