Git 存储库是否可以在操作系统和文件系统之间移植

Git 存储库是否可以在操作系统和文件系统之间移植

... 特别是通过 FAT32 或 exFAT USB 闪存驱动器移动时?

尽管工作副本可能会遭受权限更改,并且明显删除符号链接(如果使用它们)......这些更改 Git 可以很好地检测到,除此之外,.git/内容是否足够清晰,可以将存储库从一个操作系统和/或文件系统移动到另一个操作系统和/或文件系统?例如 Windows、常见的 Linux 发行版、macOS、NTFS、ext FS、安普森...

如果有必要的话我可以假设 Git 版本 2+。

答案1

是的,存储库数据库是通常可移植至所有现代操作系统,包括Windows。它不依赖任何扩展属性,到目前为止也不依赖区分大小写。数据库内的文件名似乎最多为 52 个字符。

主要要求是文件名保存即使在不区分大小写的文件系统上也是如此(例如,如果你将 .git/HEAD 从 ext4 复制到 FAT32,再复制到 APFS,再复制到 HFS+,再复制到 ext4,它应该仍然是 .git/HEAD,而不是 .git/head)。幸运的是,上面列出的所有文件系统保留大小写,这样就可以了。

需要记住的一点是,每个分支或标签都表示为 .git/refs 下的单独文件。Git 强制执行严格的字符集限制,以便与任何文件系统配合使用,但这并不总是足够的——如果您要迁移到不区分大小写的文件系统(例如 APFS 或 NTFS),最好希望存储库不包含仅大小写不同的多个分支或标签。同样,Git 不禁止使用旧式 DOS 设备名称(例如aux或 )nul作为分支/标签名称。


(从技术上讲,在不同的文件系统之间移动 repo 可能会丢失一些文件元数据,例如对象 blob 的“只读”(a-w)状态,但这不是 Git 本身所关注的内容。)


如果您仅将 FAT32 用作临时传输,请考虑使用git pack-refs --all --prunerm -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.ignorecase可能core.autocrlf还有core.safecrlf其他core.fileMode 一些项。

  • git 克隆 是可以在计算机之间进行的安全操作:

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

    克隆会自动创建一个名为“origin”的远程连接,指向原始存储库,从而可以轻松地与中央存储库进行交互。

您可能会对阅读以下有关选择性移动 git 目录的教程感兴趣:

如何移动完整的 Git 存储库

相关内容