10

私はこれを含むgitリポジトリを持っています.gitattributes:

my_script.py export-subst
Makefile export-ignore
README.md export-ignore
.gitattributes export-ignore
.gitignore export-ignore
hooks/ export-ignore
tests/ export-ignore
*.pyc export-ignore

しかし、私が作るとき:

git archive HEAD | tar -x -C ../archive_dir

ディレクトリで、archive_dirディレクトリを取得し、次のようにhookstestsます。

 ls ../archive_dir/
 hooks/  my_script.py tests/

なんで?

私のgitバージョンは1.7.9です。

4

2 に答える 2

12

/ディレクトリ内のを削除しました。これで問題が解決しました

my_script.py export-subst
Makefile export-ignore
README.md export-ignore
.gitattributes export-ignore
.gitignore export-ignore
hooks export-ignore
tests export-ignore
*.pyc export-ignore

同様の質問への回答で解決策を見つけます: git ignoring .gitattributes pattern

于 2014-02-17T15:12:51.593 に答える
2

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 ( 20212四半期)リファクタリングますÆvar Arnfjörð Bjarmason ( ) . ( 2021 年 3 月 30 日コミット ad16f74Junio 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()それ自体にフィードしますが、使用しません。

于 2014-12-02T13:01:33.597 に答える