13

aと の 2 つのファイルを含む単一のコミットを含む単純なテスト リポジトリが与えられた場合、b特定のファイルのリストを取得できます。

$ git ls-files a
a

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

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

特定のファイルのアーカイブを作成できます。

$ git archive HEAD a | tar tf -
a

しかし、特定のファイルを除くすべてのファイルのアーカイブを作成することはできません:

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

特定のファイルのアーカイブを使用するオプションは、コマンドライン引数の最大長を超えているため、実際のリポジトリではオプションではありません。

.gitattributes属性を介して除外するファイルのリストを保存できることはわかっていexport-ignoreますが、リストは動的に生成されます。ファイルを自動的に変更できますが、別のコミットが完了するまで変更が反映されません。

別のコミットを必要とせずに機能する他の呼び出しはありますか?

4

5 に答える 5

9

属性はいくつかの場所から読み取ることができますが.gitattributes、それらの中で最も一般的なものにすぎません。2 つ目 (リポジトリごとの構成と見なされる) は$GIT_DIR/info/attributes.

マニュアルを引用するには:

.gitattributesデフォルトでは、属性はアーカイブされているツリー内のファイルから取得されることに注意してください。事後に出力が生成される方法を微調整したい場合 (たとえば、適切な を に追加せずにコミットした場合 export-ignore) .gitattributes、必要に応じてチェックアウトされた.gitattributesファイルを調整し、--worktree-attributesオプションを使用します。または、ファイル内のツリーをアーカイブする際に適用する必要のある属性を保持することもでき $GIT_DIR/info/attributesます。

したがって、可能であれば、リストをそのファイルに貼り付けてから実行してくださいgit archive

もう 1 つの方法は、使用せずに、ファイルを受け入れるコマンドライン オプションを渡すワーク ツリーgit archiveだけを使用することです。これは裸のリポジトリでは機能しませんが、アーカイブする前にチェックアウトしても問題ない場合は、これを実行して、正しい環境と環境を提供することで実行できます。変数。tartar--exclude-fromgit read-treegit checkout-index$GIT_INDEX_FILE$GIT_WORK_TREE

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

基本的に、あなたはすることができます

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

パイプラインの最初のパイプラインはすべてをアーカイブし、2 番目のパイプラインはシェル グロブ パターンtarに一致するファイルを除いてすべてを通過させます。*.pdf

したがって、シェルグロブを使用して削除するファイルを指定することがコマンドラインの制限に適合する場合は、出力を不要なものを削除するプロセスgit archiveにパイプするだけです。tar

于 2016-08-03T08:44:16.083 に答える
4

tar を作成してから、内部にある必要のないフォルダーとファイルを削除できます

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

このようにして、コマンド ラインを分割して、cli 引数の最大長を超えないようにすることができます。

于 2016-08-03T08:35:08.993 に答える
3

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

于 2016-08-03T08:44:24.103 に答える