174140 Asked: 2019-07-22 04:20:21 +0800 CST2019-07-22 04:20:21 +0800 CST 2019-07-22 04:20:21 +0800 CST git存储库在操作系统和文件系统之间是否可移植 772 ... 特别是通过 FAT32 或 exFAT USB 闪存盘移动时? 即使工作副本可能会发生权限更改,并且明显删除符号链接(如果使用它们)......这些是 Git 将很好地检测到的更改,除此之外,目录内容是否.git/足够可靠允许将存储库从一个操作系统和/或文件系统移动到另一个?例如 Windows、常见的 Linux 发行版、macOS、NTFS、ext FS、APFS ... 如有必要,我可以假定 Git 版本 2+。 git 2 个回答 Voted Best Answer user1686 2019-07-22T05:45:12+08:002019-07-22T05:45:12+08:00 是的,存储库数据库通常可以跨所有现代操作系统移植,包括Windows。它不依赖于任何扩展属性,到目前为止也不依赖于区分大小写。数据库中的文件名似乎最多 52 个字符。 主要要求是文件名保留其大小写,即使在不区分大小写的文件系统上也是如此(例如,如果您将 .git/HEAD 从 ext4 复制到 FAT32 到 APFS 到 HFS+ 到 ext4,它应该保留 .git/HEAD 而不是成为 .git/head ). 幸运的是,上面列出的所有文件系统都是大小写保留的,所以这很好。 要记住的一件事是每个分支或标签都表示为 .git/refs 下的一个单独文件。Git 强加了一个严格的字符集限制以便与任何文件系统一起工作,但这并不总是足够的——如果你正在移动到一个不区分大小写的文件系统(比如 APFS 或 NTFS)最好希望存储库不包含多个分支或标签仅在大小写上有所不同。同样,Git 也不禁止使用旧版 DOS 设备名称,例如aux或nul作为分支/标签名称。 (从技术上讲,跨不同文件系统移动存储库可能会丢失一些文件元数据,例如对象 blob 的“只读”( a-w) 状态,但这不是 Git 本身所关注的东西。) 如果您仅将 FAT32 用作临时传输,请考虑使用git pack-refs --all --prune并rm -rf .git/logs避免任何分支名称问题,尽管它们不太可能。同时运行 agit repack -d; git prune以减少松散对象文件的数量。 您甚至可以使用它git bundle来创建一个包含全部或部分提交历史记录的传输友好型 blob。 harrymc 2019-07-22T06:02:52+08:002019-07-22T06:02:52+08:00 虽然复制.git目录在大多数情况下都有效,但有一些注意事项需要注意: git-svn 可能会记住一些您不想复制的用户信息,例如姓名和电子邮件地址,例如在.git/logs/refs/remotes/trunk. 克隆的存储库将包含一个返回到复制命令不会取消创建的父级的链接。您可以使用删除该链接git remote remove origin。 如果.git目录中有符号链接,则需要确保取消对它们的引用。例如: cp -r -L <source-repo-dir> <destination-repo-dir> 一些配置项可能因平台而异,例如自定义差异驱动程序和引用外部程序的挂钩脚本。在不同平台之间复制时,应该验证诸如core.ignorecase、core.autocrlf、 和可能的其他一些项目。core.safecrlfcore.fileMode git clone 是一个安全的操作,可以在计算机之间操作: git clone ssh://[email protected]/path/to/my-project.git 克隆会自动创建一个名为“origin”的远程连接,指向原始存储库,从而轻松与中央存储库进行交互。 阅读以下选择性移动 git 目录的教程可能会很有趣: 如何移动完整的 Git 存储库
是的,存储库数据库通常可以跨所有现代操作系统移植,包括Windows。它不依赖于任何扩展属性,到目前为止也不依赖于区分大小写。数据库中的文件名似乎最多 52 个字符。
主要要求是文件名保留其大小写,即使在不区分大小写的文件系统上也是如此(例如,如果您将 .git/HEAD 从 ext4 复制到 FAT32 到 APFS 到 HFS+ 到 ext4,它应该保留 .git/HEAD 而不是成为 .git/head ). 幸运的是,上面列出的所有文件系统都是大小写保留的,所以这很好。
要记住的一件事是每个分支或标签都表示为 .git/refs 下的一个单独文件。Git 强加了一个严格的字符集限制以便与任何文件系统一起工作,但这并不总是足够的——如果你正在移动到一个不区分大小写的文件系统(比如 APFS 或 NTFS)最好希望存储库不包含多个分支或标签仅在大小写上有所不同。同样,Git 也不禁止使用旧版 DOS 设备名称,例如
aux
或nul
作为分支/标签名称。(从技术上讲,跨不同文件系统移动存储库可能会丢失一些文件元数据,例如对象 blob 的“只读”(
a-w
) 状态,但这不是 Git 本身所关注的东西。)如果您仅将 FAT32 用作临时传输,请考虑使用
git pack-refs --all --prune
并rm -rf .git/logs
避免任何分支名称问题,尽管它们不太可能。同时运行 agit repack -d; git prune
以减少松散对象文件的数量。您甚至可以使用它
git bundle
来创建一个包含全部或部分提交历史记录的传输友好型 blob。虽然复制
.git
目录在大多数情况下都有效,但有一些注意事项需要注意:git-svn 可能会记住一些您不想复制的用户信息,例如姓名和电子邮件地址,例如在
.git/logs/refs/remotes/trunk
.克隆的存储库将包含一个返回到复制命令不会取消创建的父级的链接。您可以使用删除该链接
git remote remove origin
。如果
.git
目录中有符号链接,则需要确保取消对它们的引用。例如:一些配置项可能因平台而异,例如自定义差异驱动程序和引用外部程序的挂钩脚本。在不同平台之间复制时,应该验证诸如
core.ignorecase
、core.autocrlf
、 和可能的其他一些项目。core.safecrlf
core.fileMode
git clone 是一个安全的操作,可以在计算机之间操作:
克隆会自动创建一个名为“origin”的远程连接,指向原始存储库,从而轻松与中央存储库进行交互。
阅读以下选择性移动 git 目录的教程可能会很有趣:
如何移动完整的 Git 存储库