一旦你更改了一个伪符号链接文件的内容,且没有将其模式从符号链接更改为常规文件并提交结果,您就创建了一个不能在具有真实符号链接的操作系统中提取的 blob,因为您拥有一个应该是符号链接但其内容太长而无法成为路径名的对象。网页界面隐藏了这个问题,对你没有任何帮助。
你可能需要返回到那个提交,修复它,并重新提交之后的所有内容。git rebase -i
会有所帮助,但这仍然可能不容易,尤其是如果在这些虚假的符号链接状态下进行了更多文件更改。
假设坏的提交是abcdef123
,你需要这样做:
git rebase -i 'abcdef123^'
这将使您进入带有提交列表的编辑器。 abcdef123
应该在第一行。 在该行上,将 pick
改为 edit
。 如果有多个错误提交,则全部更改为 edit
。 保存并退出编辑器。
现在,您将回到提交错误文件的时间点。 这是您修改历史记录的机会,纠正曾经出错的事情。 使用以下命令检查提交:
git show
通过将原始符号链接路径名恢复到文件中并使用git add
来撤消错误部分。或者,您可以使用git rm
彻底摆脱符号链接,然后创建一个新文件并git add
它。如果选择第一种选项,请注意符号链接的内容只是一个路径名。它不是文本文件-它没有换行符。如果您使用添加换行符的文本编辑器进行编辑,则会出现损坏的符号链接(指向名称中带有换行符的文件)。
完成git add
后,将修复的提交重新插入历史记录中的相应位置:
git commit --amend
git rebase --continue
如果你将多个提交从pick
更改为edit
,则必须对每个提交重复该过程。最终的git rebase --continue
将带您回到当前状态。
如果在rebase期间你发现自己处于一个错误的提交中(它除了用文件指向的未修改内容替换符号链接外没有其他操作),那么你可以使用git rebase --skip
而不是修订并继续。如果你预先知道这将会发生,你只需从git rebase -i
列表中删除错误的提交,而不是将其pick
更改为edit
。
如果有多个分支受到坏提交的影响,你必须对每个分支重复整个过程。检出一个分支,运行git rebase -i
完成(即当git rebase --continue
显示“成功rebase”时),然后检出下一个分支再重复上述步骤。
在将来,当你把开发工作分配到Windows和真正的操作系统之间时,请使用cygwin进行Windows工作。在cygwin内部,符号链接就是符号链接,你不会像以前那样搞砸它们。
git add <问题文件>
才能正常工作。完美的答案! - JustCodinggit pull
失败的目录——有问题的提交不在那里。(也许在较新版本的Git中已更改?)基本上,我不得不使用:git clone --no-checkout --reference the-repo <CLONEURL> tmp-clone-dir
(使用引用可以使克隆更快。)或者您可以使用原始命令,只需编辑.git/config
。 - hansfn