.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と一致しなかった削除されたディレクトリは結局「空」であることが判明しました。(サブディレクトリはありましたが、ディレクトリツリーにはファイルがありませんでした...)
git clean
デフォルトで削除されるものを誤って解釈しました-d
。(注:私はgit clean
自分の大ファンではありません。貴重なファイルを削除するのは簡単すぎます。)
博士ノート、内のファイル一覧表示.gitignore
、具体的無効を持つ、デフォルトでは、git clean
離れてきれいに。ただし、git clean
それよりも(大幅に)複雑です。これについては後で説明します。
ただし、最初に、.gitignore
エントリの1つの特殊性について説明しましょう。あなたがすでにこれをすべて知っているなら(しかし誰もそうは思わない:-))、あなたはgit clean
以下の-特定のセクションにスキップすることができます。
追跡されている(現在インデックスにある)ファイルが無視されることはないため、.gitignore
または同等の(たとえば.git/info/exclude
)パターンの一致は関係ありません。
フレーズは今インデックスにありますそれはまさにそれを意味します。git add
またはgit rm --cached
を使用してファイルを追加または削除すると、その追跡性が変わります。を使用git ls-files --stage
して、インデックス内のすべてのファイルの完全なリストを、そのステージングデータ(モード、ハッシュ、およびステージスロット番号)とともに、または--stage
名前だけを取得せずにダンプすることもできます。
ファイル今指標ではありませんGitリポジトリによって発見されている(いないディレクトリ)、である人跡未踏。Gitはディレクトリを保存しないため、ディレクトリがインデックスに表示されることはありません。1追跡または追跡解除は、純粋にファイルのプロパティです。
追跡されていないファイルも無視される可能性があります。その場合git add
、コマンドラインで明示的に名前を付けたとしても、追加しないでください(ただし、明示的に名前を付けて、使用--force
して追加することもできます)。
これは、ファイル(ディレクトリではない)が、追跡、追跡されていない(のみ)、または追跡されて無視される3つのカテゴリのいずれかに分類されることを意味します。これはgit status
、追跡されていないファイル(追跡されて無視されていないファイルではない)についてのみ不平を言うだけでなく、すぐに問題になりgit clean
ます。
最後に、Gitが完全なディレクトリツリー検索/スキャンを実行していgit add .
て(たとえば)、スキップできる可能性のあるディレクトリ(追跡されたファイルがない)に遭遇すると、Gitはディレクトリ自体が.gitignore
パターンと一致するかどうかを確認します、もしそうなら、その中を見ないでください。これは、スピードアップgit status
とgit 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]
コメントを追加