Git:无法创建符号链接(文件名太长)

我将一个项目从linux推到bitbucked,然后在windows上克隆它。 结果发现有两个符号链接,它们在窗口上显示为文本文件。 由于我知道他们应该指向哪里,因此我将它们替换为目标文件的副本,并进行提交和推送。

现在,当我从他们的Web界面查看它时,butbucket存储库看起来没问题。 然而,我的unix机器上的git克隆给了我两条消息:

error: unable to create symlink ... (File name too long)

而这两个符号链接文件以前都没有。 我试图克隆到/ tmp / ...以获得更短的文件名,但得到了相同的结果。 这表明,Bitbucket存储库出现问题。 我试着打开和关闭了core.symlinks

我可以生活没有符号链接,但我想有一个工作的存储库。 有人知道一种方式(除了重新创建仓库)吗?


只要您更改伪符号链接文件的内容而不将它的模式从符号链接更改为常规文件并提交结果,则您在具有实际符号链接的OS上无法提取blob,因为您拥有该对象应该是符号链接,但其内容太长而无法成为路径名。 通过隐藏这个问题,Web界面并没有对你有所帮助。

您可能不得不备份该提交,修复它,然后重新提交所有内容。 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

如果从改变多次提交pickedit你必须重复该过程的每一个。 最后的git rebase --continue会让你回到现在。

如果您在重新绑定期间处于过去的提交状态,并且您发现整个提交都很糟糕(除了替换指向该文件的未修改内容的符号链接,它没有其他任何操作),那么您可以使用git rebase --skip来代替修改并继续。 如果您事先知道会发生这种情况,您可以从git rebase -i列表中删除错误的提交,而不是更改它的pick以进行edit

如果您有多个分支受到错误提交的影响,您将不得不为每个分支重复整个过程。 检查一个分支,运行git rebase -i来完成(这是当git rebase --continue表示“成功重新发布”时),然后检查下一个分支并重新执行。

将来,在Windows和真正的操作系统之间分离开发工作时,请使用cygwin来运行Windows。 在cygwin里面,符号链接是符号链接,你不能像你一样搞乱它们。


这里有一个解决方案,不需要你回去修改提交。 毕竟,如果回购是远程或共享的,可能不可行。 它使用core.symlinks = false。 你说过你试过这个,但没有说什么时候。 您必须在结帐前执行此操作,默认情况下这是普通克隆所执行的操作。 所以你必须使用--no-checkout选项克隆。

git clone --no-checkout the-repo tmp-clone-dir
cd tmp-clone-dir
git config core.symlinks false
git checkout
cp the-problem-file the-problem-file.bak # make a backup
git rm the-problem-file
git commit -m 'Removed problem file pretending to be a symlink' the-problem-file
mv the-problem-file.bak the-problem-file # restore the backup; now it will be of type file
git commit -m 'Added back the problem file - now with the correct type' the-problem-file
git push origin master
cd ..
rm -rf tmp-clone-dir  # IMPORTANT

最后一步很重要,因为您不想在core.symlinks = false的repo中做更多工作。 这只是要求麻烦。

上面假设你希望文件是一个文件而不是符号链接。 如果它是一个符号链接,那么你会在第一次提交后停止,删除tmp-clone-dir并返回到正常的repo checkout来创建符号链接并提交它。

这种方法的好处是你不会破坏任何相关的克隆和分支,因为它保留了历史记录。 这样做的缺点是,破坏的提交仍然存在,如果他们尝试使用特定的错误提交,将会给任何人造成问题。


我有这个问题,这解决了它对我来说:

git config core.symlinks false
git rm <problem-file>
git commit <problem-file>
git push
git config core.symlinks true
链接地址: http://www.djcxy.com/p/78111.html

上一篇: Git: unable to create symlink (File name too long)

下一篇: How to setup symlink in xampp for osx