Git 2.2+ (2014 年 11 月) 以降に可能な別のアプローチは、アーカイブに含めるパスをフィルター処理することです。
Nguyễn Thái Ngọc Duy ( )によるコミット ed22b41を参照してください。pclouds
archive
: グロブによるパスのフィルタリングをサポート
このパッチは、: (glob)
(または " *.c
" なしで " :(glob)
") を使用する際の 2 つの問題を修正します。
1 つ目は、 で「再帰」フラグをオンにするのを忘れたことstruct pathspec
です。それがなければ、tree_entry_interesting()
潜在的なディレクトリを「興味深い」とマークしないため、それらのディレクトリにパス仕様に一致するものがあるかどうかを確認できます。
ディレクトリを興味深いとマークすることには、ディレクトリの中を歩き回ってそこに興味のあるものが何もないことを認識する必要があるという副作用があります。その時までに、' archive
' コードは既に (空の) ディレクトリを書き留めています。
これは、結果アーカイブに空のディレクトリがたくさんあることを意味します。
この問題は、ディレクトリが実際に必要であることがわかっているときに、ディレクトリを遅延して書き留めることで修正されます。この実装には理論的なバグがあります。そのパススペックに一致する空のツリー/ディレクトリを書き込むことはできません。
path_exists()
この「再帰的」フラグがオンの場合、いくつかのディレクトリに一致する可能性が高いため、一致しないパス仕様を検出するためにもより厳密になります。最も簡単な方法は、「一致した」ディレクトリを考慮しないことです。
例:
git archive -v HEAD -- ":(glob)**/sh"
git archive -o docs.zip v2.2.0 'Documentation/*.html'
注 (7年後)、この同じコマンドは Git 2.32 ( 2021年第2四半期)でリファクタリングされています。Ævar Arnfjörð Bjarmason ( ) . ( 2021 年 3 月 30 日、コミット ad16f74でJunio C Hamanoによってマージされました)avar
gitster
たとえば、上記のコミットを参照すると、次のようになります。
archive
: 「ステージ」の通過をやめるread_tree_recursive()
署名者: Ævar Arnfjörð Bjarmason
アーカイブ コードで渡される" stage
" 変数は、値 "0" をハードコードする精巧な方法でしかありませんでした。
このコードは、e4fbbfe (「追加git-zip-tree
」、2006 年 8 月 26 日、Git v1.4.3-rc1 --マージ) で元の形式で追加されました。この時点で、ハードコーディングされた「0」が に渡されread_tree_recursive()
ますwrite_zip_entry()
。
その後、 ed22b41 (" : support filtering paths with glob", 2014-09-21, Git v2.2.0-rc0 -- mergestruct directory
) の " " に熱心に追加されましたが、次のように渡す以外はまだ何もしていませんでした。 -は。archive
の内部コードでこれを行うのをやめましょうarchive.c
。「0」をread_tree_recursive()
それ自体にフィードしますが、使用しません。