Gitリポジトリはオペレーティングシステムとファイルシステム間で移植可能か

Gitリポジトリはオペレーティングシステムとファイルシステム間で移植可能か

...特に FAT32 または exFAT USB フラッシュ ドライブ経由で移動した場合はどうなるでしょうか?

作業コピーはおそらく権限の変更やシンボリックリンクの削除(使用している場合)の影響を受けるでしょうが、これらはGitがうまく検出する変更ですが、それ以外では、.git/ディレクトリの内容は、リポジトリをあるオペレーティング システムやファイル システムから別のオペレーティング システムやファイル システムに移動できるほど十分に健全ですか?例:Windows、一般的なLinuxディストリビューション、macOS、NTFS、ext FS、APFS...

必要に応じて Git バージョン 2 以上を想定できます。

答え1

はい、リポジトリデータベースはいつものすべての最新オペレーティングシステムに移植可能、含むWindows。拡張属性には依存せず、これまでのところ大文字と小文字の区別にも依存しません。データベース内のファイル名は最大 52 文字のようです。

主な要件は、ファイル名が保存する大文字と小文字を区別しないファイルシステムでも、大文字と小文字は区別されます(たとえば、.git/HEADをext4からFAT32、APFS、HFS+、ext4にコピーした場合、.git/HEADのままで、.git/headにはなりません)。幸い、上記のすべてのファイルシステムでは、大文字と小文字は区別されるので問題ありません。

覚えておくべきことの 1 つは、各ブランチまたはタグが .git/refs の下に個別のファイルとして表されることです。Git は、あらゆるファイルシステムで動作するように厳格な文字セット制限を課していますが、それだけでは十分ではありません。大文字と小文字を区別しないファイルシステム (APFS や NTFS など) に移行する場合は、リポジトリに大文字と小文字だけが異なる複数のブランチまたはタグが含まれていないことを祈るしかありません。同様に、Git は、auxや などの従来の DOS デバイス名をnulブランチ/タグ名として使用することを禁止していません。


(技術的には、リポジトリを異なるファイルシステム間で移動すると、オブジェクト BLOB の「読み取り専用」( a-w) 状態などの一部のファイル メタデータが失われる可能性がありますが、これは Git 自体が確認するものではありません。)


FAT32 を一時的なトランスポートとしてのみ使用する場合は、ブランチ名の問題を回避するために、およびを使用することを検討してください (git pack-refs --all --prune発生rm -rf .git/logsする可能性は低いですが)。また、を実行して、git repack -d; git pruneルーズ オブジェクト ファイルの数を減らします。

git bundleコミット履歴のすべてまたは一部を含む、トランスポート対応の BLOB を作成するためにも使用できます。

答え2

.gitほとんどの場合、ディレクトリをコピーすると機能しますが、注意が必要な注意事項がいくつかあります。

  • git-svn は、名前や電子メール アドレスなど、コピーしたくないユーザー情報を記憶している場合があります (例: ) .git/logs/refs/remotes/trunk

  • クローンされたリポジトリには、コピー コマンドでは削除されない親へのリンクが含まれます。 を使用してそのリンクを削除できますgit remote remove origin

  • ディレクトリ内にシンボリック リンクがある場合は.git、それらを逆参照するようにしてください。例:

    cp -r -L <source-repo-dir> <destination-repo-dir>
    
  • 一部の設定項目は、カスタム diff ドライバーや外部プログラムを参照するフック スクリプトなど、プラットフォームによって異なる場合があります。異なるプラットフォーム間でコピーする場合は、、、などの項目や、おそらくその他の項目も確認する必要core.ignorecasecore.autocrlfありcore.safecrlfますcore.fileMode

  • git クローン コンピュータ間で実行できる安全な操作です。

    git clone ssh://[email protected]/path/to/my-project.git
    

    クローンを作成すると、元のリポジトリを指す「origin」と呼ばれるリモート接続が自動的に作成され、中央リポジトリとのやり取りが容易になります。

Git ディレクトリを選択的に移動するための次のチュートリアルを読むと興味深いかもしれません。

完全なGitリポジトリを移動する方法

関連情報