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

时间:2013-08-23 20:20:44

标签: git bitbucket symlink

我把一个项目从linux推到了bitbucked,然后在windows上克隆了它。原来有两个符号链接,在Windows上显示为文本文件。由于我知道他们应该指向哪里,因此我将其替换为目标文件的副本,已提交并推送。

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

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

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

我可以在没有符号链接的情况下生活,但我想拥有一个有效的存储库。有没有人知道一种方法(除了重新创建存储库)?

5 个答案:

答案 0 :(得分:17)

这是一个不需要您返回并修复提交的解决方案。 如果回购是远程或共享的话,它可能是不可行的。 它使用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来制作符号链接并提交它。

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

答案 1 :(得分:16)

只要更改了假符号链接文件的内容而没有将其模式从符号链接更改为常规文件并提交结果,您就会创建一个无法在具有真正符号链接的操作系统上提取的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

如果您将多次提交从pick更改为edit,则必须为每个提交重复此过程。最后的git rebase --continue会让你回到现在。

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

如果有多个分支受到错误提交的影响,则必须为每个分支重复整个过程。检查一个分支,运行edit完成(这是git rebase -i说“成功重新命名”),然后检查下一个分支并再次执行。

将来,在Windows和实际操作系统之间拆分开发工作时,请使用cygwin。在cygwin里面,符号链接是符号链接,你不能像你那样搞乱它们。

答案 2 :(得分:5)

我有这个问题,这解决了我:

git config core.symlinks false
git rm <problem-file>
git commit <problem-file>
git push
git config core.symlinks true

答案 3 :(得分:1)

如果您使用bitbucket,还有一种更简单的方法。由于现在bitbucket支持在线删除文件,你可以在bitbucket上找到你的仓库,找到有问题的文件,按下&#34;编辑&#34;附近的下拉按钮。按钮和&#34;删除&#34;。

这将删除带有符号链接的文件,并且您再次有一个工作目录。如果这是可能的话,它比手动重新定位和删除要快得多。

答案 4 :(得分:0)

文件数量少,我也遇到了同样的问题。我通过使用git remove --cached <file>从存储库中删除它们来解决它,该方法不会删除源中的文件(不再是符号链接)。删除所有内容后,git会看到它们仍然存在,因此我可以使用git add .将它们添加回去,然后再次提交它们。现在git将它们视为普通文件。