.gitignoreマスキングとgitcleanを理解する

チャールストン

.gitignoreファイルがどのように機能するかを理解するのに本当に苦労しています...

これは私のファイルがどのように見えるかです:

custom/history
cache
*.log
custom/modules/*/Ext
upload
sugar-cron*
custom/application/Ext
custom/Extenstion/modules/*/Ext/Language
!custom/modules/*/Language/cs_CZ.*
!custom/modules/*/Language/en_us.*
custom/Extenstion/application/Ext/Language
!custom/Extenstion/application/Ext/Language/cs_CZ.*
!custom/Extenstion/application/Ext/Language/en_US.*
.htaccess
config.php
config_override.php
files.md5

これは私のgitステータスがどのように見えたかです:

apache@cb772759c68a sugarcrm$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#    LOG.txt
#    deploy_backup/
nothing added to commit but untracked files present (use "git add" to track)

そこで、追跡されていない2つのファイルを削除したかったのですが、驚いたことに、他のファイルもすべて削除されました。

apache@cb772759c68a sugarcrm$ git clean -fd
Removing Disabled/upload:/
Removing LOG.txt
Removing custom/Extension/modules/Bugs/Ext/Language/
Removing custom/Extension/modules/Cases/Ext/Language/
Removing custom/Extension/modules/EmailAddresses/
Removing custom/Extension/modules/EmailParticipants/
Removing custom/Extension/modules/ForecastManagerWorksheets/
Removing custom/Extension/modules/ForecastWorksheets/
Removing custom/Extension/modules/Forecasts/
Removing custom/Extension/modules/Meetings/Ext/Layoutdefs/
Removing custom/Extension/modules/Meetings/Ext/WirelessLayoutdefs/
Removing custom/Extension/modules/Meetings/Ext/clients/
Removing custom/Extension/modules/ModuleBuilder/
Removing custom/Extension/modules/OutboundEmail/
Removing custom/Extension/modules/PdfManager/
Removing custom/Extension/modules/ProjectTask/Ext/Language/
Removing custom/Extension/modules/Quotas/
Removing custom/Extension/modules/Quotes/Ext/Dependencies/
Removing custom/Extension/modules/Targets/
Removing custom/Extension/modules/Tasks/Ext/Language/
Removing custom/Extension/modules/TimePeriods/
Removing custom/application/
Removing custom/install/
Removing custom/modules/Administration/
Removing custom/modules/Bugs/
Removing custom/modules/Cases/
Removing custom/modules/Contracts/
Removing custom/modules/Emails/
Removing custom/modules/HHP_Products/
Removing custom/modules/KBContents/
Removing custom/modules/Project/
Removing custom/modules/ProjectTask/
Removing custom/modules/ProspectLists/
Removing custom/modules/Prospects/
Removing custom/modules/Quotas/
Removing custom/modules/Reports/
Removing custom/modules/RevenueLineItems/
Removing custom/modules/Schedulers/
Removing custom/modules/Tags/
Removing custom/modules/Teams/
Removing custom/modules/hhp_assignment_zip/
Removing custom/modules/hhp_zipcode/
Removing custom/working/modules/Calls/
Removing custom/working/modules/Leads/clients/
Removing deploy_backup/
Removing deploy_log/
Removing dist/identity-provider/tests/docker/saml-test/config/simplesamlphp/config/
Removing vendor/sugarcrm/identity-provider/tests/docker/saml-test/config/simplesamlphp/config/

最初のポイント-削除されたファイルは表示されなかったgit statusので、明らかにgitignoreの「マスク」の一部でした...誰かが説明できますか、これらのファイルのいずれかがgitignoreのパターンのいずれかにどのように一致しますか?のようにvendor/sugarcrm/identity-provider/tests/docker/saml-test/config/simplesamlphp/config/...誰かが適切なgitignoreを構築するのを手伝ってくれる?

2番目のポイント-.gitignoreはgit cleanこれらのバージョン管理されていないファイルをから「保護」し、gitは文字通りそれらに対して何のアクションも実行しないと思いました。だから明らかにそれはそれらを削除します...使用中にバージョン管理されていないファイルを削除できないのはgit cleanどうしてですか?

編集:私はgitcleanとgitrmを混同しました、私はずっとgitcleanについて話していました

編集2:.gitignoreと一致しなかった削除されたディレクトリは結局「空」であることが判明しました。(サブディレクトリはありましたが、ディレクトリツリーにはファイルがありませんでした...)

火曜日

TL; DR

git cleanデフォルトで削除されるものを誤って解釈しました-d(注:私はgit clean自分の大ファンではありません。貴重なファイルを削除するのは簡単すぎます。)

長いです

博士ノート、内のファイル一覧表示.gitignore、具体的無効を持つ、デフォルトでは、git clean離れてきれいに。ただし、git cleanそれよりも(大幅に)複雑です。これについては後で説明します。

ただし、最初に、.gitignoreエントリの1つの特殊性について説明しましょうあなたがすでにこれをすべて知っているなら(しかし誰もそうは思わない:-))、あなたはgit clean以下の-特定のセクションにスキップすることができます。

  1. 追跡されている(現在インデックスにある)ファイルが無視されることはないため、.gitignoreまたは同等の(たとえば.git/info/exclude)パターンの一致は関係ありません。

    フレーズインデックスにありますそれはまさにそれを意味します。git addまたはgit rm --cached使用してファイルを追加または削除すると、その追跡性が変わります。を使用git ls-files --stageして、インデックス内のすべてのファイルの完全なリストを、そのステージングデータ(モード、ハッシュ、およびステージスロット番号)とともに、または--stage名前だけを取得せずダンプすることもできます。

  2. ファイル今指標ではありませんGitリポジトリによって発見されている(いないディレクトリ)、である人跡未踏Gitはディレクトリを保存しないため、ディレクトリがインデックスに表示されることはありません。1追跡または追跡解除は、純粋にファイルのプロパティです。

  3. 追跡されていないファイルも無視される可能性があります。その場合git add、コマンドラインで明示的に名前を付けたとしても、追加しないでください(ただし、明示的に名前を付けて使用--forceして追加することもできます)。

    これは、ファイル(ディレクトリではない)が、追跡、追跡されていない(のみ)、または追跡されて無視される3つのカテゴリのいずれかに分類されることを意味します。これはgit status、追跡されていないファイル(追跡されて無視されていないファイルではない)についてのみ不平を言うだけでなく、すぐに問題になりgit cleanます。

  4. 最後に、Gitが完全なディレクトリツリー検索/スキャンを実行していgit add .て(たとえば)、スキップできる可能性のあるディレクトリ(追跡されたファイルがない)に遭遇すると、Gitはディレクトリ自体.gitignoreパターンと一致するかどうかを確認ます、もしそうなら、その中を見ないでください。これは、スピードアップgit statusgit add -A/ git add .(インスタンスのための全体ベンダーツリーまたはSDKを無視することができれば、時として非常に)ようなディレクトリに。

ルール4は、ディレクトリパスの下にある特定のファイルパスを無視したくない場合は、Gitにディレクトリを特に無視ないように指示する必要がある理由ですディレクトリを無視すると、Gitがディレクトリの内部を調べることはありませんこれは特にこれらの3行に影響します。

custom/Extenstion/application/Ext/Language
!custom/Extenstion/application/Ext/Language/cs_CZ.*
!custom/Extenstion/application/Ext/Language/en_US.*

ディレクトリ全体を無視した場合custom/Extenstion/application/Ext/Language、Gitはその中を調べず、無視しないように一致custom/Extenstion/application/Ext/Language/cs_CZ.*するファイルを見つけることはありませんしたがって、ディレクトリ自体を無視されたステータスからcustom/Extenstion/application/Ext/Language/*除外する必要があります。Gitがディレクトリ内を調べる必要があるように、最初の行を読み取りに変更する必要があります。後続の行は、で終わるcs_CZ.*en_US.*チェコと米国英語ファイル用の無視の状態を上書きします。


1実際、それらはインデックスに表示できますが、特別な場合として扱われるためだけです。git ls-files、インデックスの内容を表示できるので、それらをスキップします。


使用git clean -dするとルール4が明確に変更されます

Gitは、ディレクトリが空の場合にのみディレクトリを削除できますこれは一般的なOS強制ルールです。ディレクトリdにいくつかのファイル、、d/f1などが含まれていて、最初にファイルd/f2を削除dせずに削除すると、ファイルに問題が発生します。システムは、最初にディレクトリ内のファイルを削除するように強制します。これは、同様にサブディレクトリに適用されます:あなたが削除することはできませんd場合d/sub場合でも、存在d/sub自体が空のディレクトリです。空のディレクトリのみを削除できます。

git cleanなしで実行すると-d、ルール4がインストールされたままになるだけでなく、実際に拡張されます。たとえば、最初の例では、Gitは(1)custom/Extenstion/application/Ext/Languageがディレクトリであることに気づきます。(2)ディレクトリが無視パターンに一致します。したがって、(3)すでに追跡さているファイルがない場合custom/Extenstion/application/Ext/Language、Gitはディレクトリ全体をスキップできます(もちろん、git cleanなしで実行されているため、削除しません-d)。

xyzzy/インデックスにファイルがリストされていないという名前の別のディレクトリがあるとします。このディレクトリは完全に空である可能性があります。その場合、定義上、追跡されていないファイルは含まれていません。したがって、それgit cleanなし-dでは何もするべきではありません。または、ファイルがある場合があります。これらのファイルは、(追跡されていない-と-を無視することができるので、と)人跡未踏の定義であるが、あなたは、ディレクトリを削除しないようにそう言ったgit clean まだでも内部を見て気にしません。これは少し奇妙なケースです。Gitは未知のディレクトリの内部をわざわざ調べないことがよくあります。2(あなたがでこれを見るgit statusだけでなく:あなたが使用する必要がgit status -uall見つけるために、ファイル謎ディレクトリ内をしかし。git add -Aまたはgit add .内部を見るために持っている、しない限り、 ディレクトリは無視されます。そのため、一般的なケースではルール4が少し複雑になります。)

-dただし、を使用して実行すると、ルール4が完全に破棄されるようです。繰り返しますが、ディレクトリを削除するには、Gitは最初にディレクトリ内のすべてのファイルを削除する必要があります。そのためには、Gitもコンテンツを列挙する必要があります。したがって、git cleanを使用するように指示する場合は-d、ルール4を完全に無効にすることが適切であるように思われます。パス名のディレクトリ性により、Gitはディレクトリの内容をスキャンします。追跡されたファイルがあるために内部を調べる必要があるか、ディレクトリを削除するためにファイルを削除するために内部を調べる必要があります。


2「不明」は「追跡されていない」と同じではないことに注意してください。それはGitの用語でもありません。私はここでそれを作りました。ただし、後で説明するように、Git「追跡されていないディレクトリ」というフレーズを定義した場合便利かもしれません


git clean削除し

実行git clean -nすると、何が削除されるかが表示されます。この表示では、いくつかの省略形を使用しています。ディレクトリを削除すると、そのディレクトリ内のすべてのファイルが削除されます。これには、サブファイルを含む(再帰的に)サブディレクトリが含まれます。これはで実行されているよりも安全である-f代わりに-nするので、-fあなたはそれが何をしたか削除のショーと同じように-nあなたは何それは除去するであろうショー。

デフォルトでgit clean追跡されていないファイルは削除されますが、追跡されて無視されているファイルは削除されませんつまり、上記のポイント3に戻り、ファイルの3つの分類を確認します。git clean中間の分類を削除します(のみ)。追加-X(大文字のX)は、Gitに次のように伝えます。追跡されていないファイルのみを削除しないでください。代わりに、追跡されて無視されたファイルを削除してください。

追加する-xとGitに通知さ.gitignoreます。などの通常のignore-directivesファイルを読み取らないでくださいこの時点ではファイルは無視されないため、(追跡されるファイルに関係なく)追跡を解除して無視することはできません。これを-X組み合わせても意味がありません。3なのでgit clean-xとの両方を使用することは禁じられています-X

で実行するgit clean-d、空のディレクトリが削除されます。ここでは、しかし、物事は特に不気味になります。Gitの追跡された、追跡されていない、追跡されていない、無視された分類は少し壊れているようです。ドキュメントには、次の-dように記載されています。

追跡されていないファイルに加えて、追跡されていないディレクトリを削除します。

しかし、Gitには追跡されていないディレクトリの定義がありません「追跡可能性」は、もっぱらファイルのプロパティです脚注で、ディレクトリが(さまざまなGit操作を高速化する目的で)非表示のエンティティとしてインデックスに侵入していることはわかりましたが、それは実際にはディレクトリが追跡されることを意味するわけではありません

「追跡されていないディレクトリ」は、追跡されたファイルを含まないディレクトリである可能性があります。私は、この定義が機能し、git cleanの動作を説明していると思います(しかし、私自身の満足には証明されていません)ただし、Gitのドキュメントで実際にこれが適切に定義されていれば、非常に役立ちます。


3と組み合わせる-x-X-eいくつかの実用的な用途がありますが、Gitは、少なくとも今日の時点では、これを禁止しています。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

マングーススキーマをよりよく理解する

分類Dev

カットヒルマキークラスタリングを理解する

分類Dev

gitignore:「hello /」と「hello / *」を理解する

分類Dev

類似の文字列を削除する他のテキストマイニング機能を理解する

分類Dev

CCキャンバスとマスキングをアニメートする

分類Dev

OpenCVで水平線と垂直線をマスキングする

分類Dev

SKSpriteNodeを液体としてマスキングする

分類Dev

xmlスキーマロケーションを理解する

分類Dev

スキマトロン検証を理解する

分類Dev

GLibのタスクとコンテキストを理解する

分類Dev

マングースを理解するfindOne()。remove()

分類Dev

レイキャスティングの公式を理解する

分類Dev

関数とセマンティクスを理解する

分類Dev

ヤーンワークスペースで「gitclean-xdf」を実行すると、追跡されたファイルが削除されます

分類Dev

gitignoreパターンマッチングを説明する

分類Dev

JavaエグゼキュータサービスのシャットダウンとawaitTerminationを理解する

分類Dev

CALayerとUIImageを使用してSwiftで画像をマスキングする

分類Dev

パターンマッチングとパイプ演算子を理解する

分類Dev

ノンブロッキングWebサービス呼び出しとノンブロッキングJDBCの違いを理解する

分類Dev

C#とSharePoint2013-コンテキストとリストを理解する

分類Dev

同じマングーススキーマで文字列を別のキー値と連結する方法

分類Dev

gitignoreで.vscodeトラッキングを修正する方法

分類Dev

マングースで辞書スキーマを作成する

分類Dev

マングーススキーマ配列を追加する方法

分類Dev

マングース参照スキーマで$ inを使用する方法

分類Dev

jsonからマングーススキーマを作成する

分類Dev

Pythonでnumpyと同様にJavaで配列をマスキングする

分類Dev

Word2Vecのスキップグラム構造と出力を理解する

分類Dev

OpenGLドキュメントのマトリックスを理解する方法は?

Related 関連記事

  1. 1

    マングーススキーマをよりよく理解する

  2. 2

    カットヒルマキークラスタリングを理解する

  3. 3

    gitignore:「hello /」と「hello / *」を理解する

  4. 4

    類似の文字列を削除する他のテキストマイニング機能を理解する

  5. 5

    CCキャンバスとマスキングをアニメートする

  6. 6

    OpenCVで水平線と垂直線をマスキングする

  7. 7

    SKSpriteNodeを液体としてマスキングする

  8. 8

    xmlスキーマロケーションを理解する

  9. 9

    スキマトロン検証を理解する

  10. 10

    GLibのタスクとコンテキストを理解する

  11. 11

    マングースを理解するfindOne()。remove()

  12. 12

    レイキャスティングの公式を理解する

  13. 13

    関数とセマンティクスを理解する

  14. 14

    ヤーンワークスペースで「gitclean-xdf」を実行すると、追跡されたファイルが削除されます

  15. 15

    gitignoreパターンマッチングを説明する

  16. 16

    JavaエグゼキュータサービスのシャットダウンとawaitTerminationを理解する

  17. 17

    CALayerとUIImageを使用してSwiftで画像をマスキングする

  18. 18

    パターンマッチングとパイプ演算子を理解する

  19. 19

    ノンブロッキングWebサービス呼び出しとノンブロッキングJDBCの違いを理解する

  20. 20

    C#とSharePoint2013-コンテキストとリストを理解する

  21. 21

    同じマングーススキーマで文字列を別のキー値と連結する方法

  22. 22

    gitignoreで.vscodeトラッキングを修正する方法

  23. 23

    マングースで辞書スキーマを作成する

  24. 24

    マングーススキーマ配列を追加する方法

  25. 25

    マングース参照スキーマで$ inを使用する方法

  26. 26

    jsonからマングーススキーマを作成する

  27. 27

    Pythonでnumpyと同様にJavaで配列をマスキングする

  28. 28

    Word2Vecのスキップグラム構造と出力を理解する

  29. 29

    OpenGLドキュメントのマトリックスを理解する方法は?

ホットタグ

アーカイブ