web-dev-qa-db-ja.com

WindowsとLinuxの間で切り替えた後のgit forcesインデックス

WindowsとLinuxによって共有されているディスクパーティション(フォーマット:NTFS)があります。 Gitリポジトリ(約6.7g)が含まれています。
[。] iの場合、Windowsまたはのみを使用する場合は、Linuxを使用してください。 Gitリポジトリを操作するには、すべて問題ありません。
[。]しかし、毎回システムを切り替えます。 git statusコマンドはインデックスを更新し、約1分です。 git statusを実行した後、同じシステムにgit statusを再度実行した場合。 1秒未満だけです。結果が結果です

# Just after switch from windows
[#5#wangx@manjaro:duishang_design] git status  # this command takes more than 60s
Refresh index: 100% (2751/2751), done.
On branch master
nothing to commit, working tree clean

[#10#wangx@manjaro:duishang_design] git status  # this time the command takes less than 1s
On branch master
nothing to commit, working tree clean

[#11#wangx@manjaro:duishang_design] git status  # this time the command takes less than 1s
On branch master
nothing to commit, working tree clean

Gitキャッシュについていくつかの問題があると思います。例:WindowsとLinuxはすべて.git/indexファイルをキャッシュファイルとして使用しますが、LinuxシステムのgitはWindowsによって変更された.git/indexを認識できません。そのため、インデックスを更新し、.git/indexファイルを置き換えることができます。これは、Windowsで次のgit statusスーパーファストとgit statusを非常に遅くする(Windowsシステムはインデックスファイルを再度更新するため)。

私の推測は正しいですか?もしそうなら、どのように私はさまざまなシステムのためにインデックスファイルを設定することができますか?どのようにして問題を解決することができますか?

12
ramwin

あなたはここで完全に正しいです:

  • ここで使用しているもの、gitがさまざまに index ステージング領域、またはキャッシュを呼び出します。 、実際にはキャッシュデータが含まれています。

  • それが含むキャッシュデータはシステムコールの結果です。

  • Linuxシステムによって返されたシステムコールデータは、Windowsシステムによって返されたシステムコールデータからのです。

したがって、OSスイッチはすべてのキャッシュデータを完全に無効にします。

...どのようにさまざまなシステムのインデックスファイルを使用する方法を使用できますか?

ここであなたの最善の賭けはこれを全然行うことではありません。 2つの異なるワークツリー、またはおそらく2つの異なるリポジトリを作ります。しかし、それがこの他の代替よりも苦痛な場合は、これらのアイデアを試してみてください。

Gitが単にを使用する実際のインデックスファイルは、デフォルトで.git/indexを使用します。 GIT_INDEX_FILEを他の(相対的または絶対的な)パスに設定して、ファイルを指定できます。したがって、.git/index-linux.git/index-windowsを持つことができ、使用しているどちらのOSに基づいてGIT_INDEX_FILEを設定します。

一部のGITコマンドは一時インデックスを使用します。それらはGIT_INDEX_FILEを自分自身で設定することによってこれを行います。それらが un - それを設定した場合、誤って.git/indexをこの時点で使用することができます。そのため、OSを切り替えるときに、の名前の変更.git/indexが途中で邪魔にならないようにする。以前の.git/index-windows.git/index-linuxを保持しますが、使用中に.git/indexに使用されているのか名前を変更してから、他のシステムに切り替える前に.git/index-nameに名前を変更します。

繰り返しますが、私はこれらの方法のどちらかを試みることをお勧めしませんが、それらは多かれ少なかれ働く可能性があります。

2
torek

トレクが言及されているように、あなたはおそらくこれをしたくない。オペレーティングシステム間でレポを共有することは一般的には良い考えではありません。

ただし、Linux用のWindowsとWindowsサブシステム間でレポを共有することが可能です。 core.checkStatminimalに設定して、十分でない場合はcore.trustctimefalseに設定してください。これは、索引に格納されている最小限の情報をもたらします。つまり、データはできるだけポータブルとなるようになります。

ただし、リポジトリにシンボリックリンクがある場合は、さまざまなものがリフレッシュを防ぐ予定です。 Linuxは通常、シンボリックの長さをその長さでバイト単位で)と見なされ、Windowsは1つ以上のディスクブロックを取ります。そのため、オペレーティングシステム間でサイズが不一致になります。 Sizeは、無効にできないインデックスで使用されている属性の1つであるため、これは回避できません。

2
bk2204