我将一个项目从 Linux 推送到 Bitbucket,然后将其克隆到 Windows 上。原来有两个符号链接(symbolic link),它们在 Windows 上显示为文本文件。因为我知道它们应该指向哪里,所以我用它们的目标文件的副本替换了它们,提交并推送。
现在,当我从他们的 Web 界面查看 Bitbucket 存储库时,它看起来不错。然而,我的 Unix 机器上的 git clone 给了我两条消息,比如:
error: unable to create symlink ... (File name too long)
并且之前作为符号链接(symbolic link)的两个文件不存在。我尝试克隆到/tmp/... 以获得更短的文件名,但得到了相同的结果。这表明,Bitbucket 存储库出了问题。我尝试打开和关闭 core.symlinks
。
我可以没有符号链接(symbolic link),但我想要一个可用的存储库。有人知道方法吗(除了重新创建存储库)?
最佳答案
这是一个不需要您返回并修复提交的解决方案。 毕竟,如果 repo 是远程的或共享的,则可能不可行。 它使用 core.symlinks=false。你说你尝试过这个但没有说什么时候。 您必须在 checkout 之前执行此操作,普通克隆默认情况下会执行此操作。 因此,您必须使用 --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 中做更多的工作。这只是自找麻烦。
上面假设你希望文件是一个文件而不是一个符号链接(symbolic link)。如果它是一个符号链接(symbolic link),那么您将在第一次提交后停止,删除 tmp-clone-dir 并返回到您的正常 repo 检查以创建符号链接(symbolic link)并提交它。
此方法的好处是您不会破坏任何相关的克隆和分支,因为它保留了历史记录。这样做的缺点是损坏的提交仍然存在,如果有人试图使用那个特定的错误提交,就会给任何人带来问题。
关于Git:无法创建符号链接(symbolic link)(文件名太长),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18411200/