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

标签 git bitbucket symlink

我将一个项目从 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/

相关文章:

azure - BitBucket 的 Microsoft Azure Web App 发布停止工作

git - 我怎样才能在 Bitbucket 或类似的东西上获得部署 key 的写入权限?

git - Github 使用的 diff 算法是什么?

git - 你如何轻松地取消 merge Subversion/git 中的主题分支?

git - merge 同一分支上的两个GIT提交

git - Bitbucket 存储库从昨天开始返回 "remote: Too many invalid password attempts. Try logging in through the website."(403)

linux - 如何创建 cygwin 可执行文件

ant - 无法使用 ANT 脚本删除符号链接(symbolic link)

linux - 如何获取符号链接(symbolic link)的文件描述符?

git - 使用 Dockerfile 运行步骤中的 git clone 提示输入用户名/密码