我需要克隆一个在多个 Linux 机器上运行没有问题的存储库,跨越多个发行版。
现在事实证明在 Windows 中我遇到了这个问题
error: invalid path 'soft/android-app/app/src/main/java/com/inti/bleapp/Aux.java'
fatal: unable to checkout working tree
warning: Clone succeeded, but checkout failed.
Run Code Online (Sandbox Code Playgroud)
最大的问题之一是克隆过程大约需要 15 到 20 分钟(git 有很多历史)。
这个错误是在最后抛出的。我不能,为了我的生活弄清楚为什么 Windows 不喜欢这条路。
任何人都可以给我任何线索吗?
tor*_*rek 15
如果您可以让其他人(例如在 Linux 上)重命名有问题的文件并提交,那就可以了。或者只是启动一个装有 Linux 的虚拟机,克隆、修复名称(及其所有用户)、提交并将更新发回。
Windows 无法处理任何名为AUX. 您不能命名文件PRN或CON或COM1两者。
error: invalid path 'soft/android-app/app/src/main/java/com/inti/bleapp/Aux.java'
您可能会反对:那不是名为AUX. 最糟糕的是,这是一个名为Aux.java.
但是对于 Windows,这是一个名为的文件AUX:
aux, Aux, auX, 等等都是拼写AUX.FILENAME.EXT. 当然,一切似乎都使用长名称,foo.data.jpg如果您愿意,您实际上可以命名文件。但在其疯狂的过去,Windows曾经使用 8.3 名称,并且它坚持支持仍然使用 8.3 名称的程序,因此所有文件在某处都获得了 8.3 名称——并且Aux.java获得了以 开头的 8.3 名称AUX,而具有扩展名则不会“让你绕过禁止的文件名。那些使用 macOS 的人可能会兴高采烈地指指点点和大笑,但 macOS 也有问题。
Linux的人就可以了,在过去,救下名称,如文件都 ip.h 与 IP.h在同一个目录。这里的想法是用小写ip.h定义TCP/IP 的 IP 报头的 little-endian 变体,并用大写 定义 big-endian 变体IP.h。默认情况下,Windows 和 macOS 都会进行大小写折叠,这给我们带来了麻烦。
除此之外,可以使用 UTF-8 以多种方式构建带重音字符的文件名 - 命名schön或agréable-的文件。Linux 文件系统可以存储任何一种方式,Git 只会采用任何存储方式,并将其放入提交文件的名称中。但是 macOS 需要一种标准化形式的文件名,这会导致相同类型的问题。
Git 需要一种方法来处理这个问题。
Git确实有“稀疏结帐”。稀疏检出允许您定义一组将从某些提交中检出的文件,以及其他不会检出的文件——它们将像往常一样进入 Git 的索引,但根本不会出现在工作树中。
您可以使用稀疏签出来签出此提交,而soft/android-app/app/src/main/java/com/inti/bleapp/Aux.java根本不提取文件。好吧,这也许没问题,但是您将没有该文件。
事实上,你已经没有了,正如最后一条消息所说:
警告:克隆成功,但结帐失败。
当结帐失败时,所有其他文件都应该在您的工作树中可用。只有这个soft/android-app/app/src/main/java/com/inti/bleapp/Aux.java不会。如果没有它也可以完成工作,则可以通过运行来模拟稀疏结帐:
git update-index --skip-worktree soft/android-app/app/src/main/java/com/inti/bleapp/Aux.java
Run Code Online (Sandbox Code Playgroud)
Git应该有一些工具来更有效地处理这些文件。特别是,应该有可能(并且,如果您深入 Git 的深处)以其他名称提取文件,然后在必要时以原始名称添加重命名的文件。应该可以(并且是,但不能使用任何明智的面向用户的命令)重命名文件并提交,之后您可以检查新提交并使用您的操作系统不讨厌的名称处理文件。
所有这一切都是可能的,因为 Git 实际上从其索引中的内容而不是您的工作树中的内容进行新的提交。索引中的名称与您的工作树中的名称相匹配没有硬性要求。但是,Git 的所有面向用户的命令git checkout—— git restore、 和git add作为主要命令——在今天都提出了这个要求。
如果您只想签出具有有效路径的文件,您可以执行以下操作(在 Git Bash 中):
git clone --sparse -c core.protectNTFS=false -n <repo-URL>
git sparse-checkout add "\!<pattern1>" "\!<pattern2>"
git checkout <branch>
Run Code Online (Sandbox Code Playgroud)
模式与存储库根相关,可以使用*
但是,如果您确实需要这些文件来构建项目,那么在 Windows 上执行此操作的最佳选择是使用WSL。
| 归档时间: |
|
| 查看次数: |
11825 次 |
| 最近记录: |