... 特别是通过 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 --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.ignorecase
可能core.autocrlf
还有core.safecrlf
其他core.fileMode
一些项。git 克隆 是可以在计算机之间进行的安全操作:
git clone ssh://[email protected]/path/to/my-project.git
克隆会自动创建一个名为“origin”的远程连接,指向原始存储库,从而可以轻松地与中央存储库进行交互。
您可能会对阅读以下有关选择性移动 git 目录的教程感兴趣: