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

Mar*_*urg 21 git symlink bitbucket

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

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

error: unable to create symlink ... (File name too long)
Run Code Online (Sandbox Code Playgroud)

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

我可以没有符号链接,但我想有一个工作存储库.有没有人知道一种方法(除了重新创建存储库)?

Mat*_*gan 19

这是一个不需要您返回并修复提交的解决方案.如果回购是远程或共享的话,它可能是不可行的.它使用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
Run Code Online (Sandbox Code Playgroud)

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

以上假设您希望文件是文件而不是符号链接.如果它是一个符号链接,那么你将在第一次提交后停止,删除tmp-clone-dir并返回正常的repo checkout以制作符号链接并提交它.

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

  • 在第二次提交之前必须使用“git add <问题文件>”。完美的答案! (2认同)

小智 16

一旦你更改了假符号链接文件的内容而没有将其模式从符号链接更改为常规文件并提交了结果,你就创建了一个无法在具有真正符号链接的操作系统上提取的blob,因为你有一个应该是符号链接的对象,但其内容太长而不能成为路径名.通过隐藏此问题,Web界面对您没有任何好处.

您可能不得不备份该提交,修复它,然后重新提交所有内容.git rebase -i会有所帮助,但它仍然可能并不容易,特别是如果你在这个伪造的符号链接 - 但不是真正的符号链接状态下对文件进行了更多的更改.

假设提交错误abcdef123,您需要这样做:

git rebase -i 'abcdef123^'
Run Code Online (Sandbox Code Playgroud)

这会让你进入一个包含提交列表的编辑器.abcdef123应该在第一行.在那一行,pick改为edit.如果存在多个错误提交,请将所有错误提交更改为edit.保存并退出编辑器.

现在,您将回到提交错误文件的时间点.这是你改变历史,把事情弄错的机会.检查提交

git show
Run Code Online (Sandbox Code Playgroud)

并通过将原始符号链接路径名恢复到文件中并撤消它来撤消坏部分git add.或者你可以真正摆脱符号链接git rm,然后创建一个新文件git add.如果选择第一个选项,请注意符号链接的内容只是路径名.它不是文本文件 - 它最后没有换行符.如果使用添加换行符的文本编辑器对其进行编辑,则会出现符号链接损坏(指向名称中带有换行符的文件).

完成后git add,将固定提交重新插入历史记录中的位置:

git commit --amend
git rebase --continue
Run Code Online (Sandbox Code Playgroud)

如果从改变多次提交pickedit你必须重复该过程的每一个.决赛git rebase --continue将带你回到现在.

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

如果您有多个受错误提交影响的分支,则必须为每个分支重复整个过程.检查一个分支,运行git rebase -i完成(即git rebase --continue"成功重新命名"时),然后检查下一个分支并再次执行.

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


git*_*rik 6

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

git config core.symlinks false
git rm <problem-file>
git commit <problem-file>
git push
git config core.symlinks true
Run Code Online (Sandbox Code Playgroud)