Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git:无法创建符号链接(文件名太长)_Git_Bitbucket_Symlink - Fatal编程技术网

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

Git:无法创建符号链接(文件名太长),git,bitbucket,symlink,Git,Bitbucket,Symlink,我将一个项目从Linux推送到Bitbucket,然后在Windows上克隆了它。原来有两个符号链接,在Windows上显示为文本文件。因为我知道它们应该指向哪里,所以我将它们替换为目标文件的副本,提交并推送 现在,当我从他们的web界面查看Bitbucket存储库时,它看起来还不错。但是,Unix机器上的git克隆会给我两条消息,如: error: unable to create symlink ... (File name too long) 这两个文件以前是符号链接,现在不存在了。我试

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

现在,当我从他们的web界面查看Bitbucket存储库时,它看起来还不错。但是,Unix机器上的git克隆会给我两条消息,如:

error: unable to create symlink ... (File name too long)
这两个文件以前是符号链接,现在不存在了。我试着克隆到/tmp/。。。获取较短的文件名,但得到相同的结果。这表明Bitbucket存储库出了问题。我尝试打开和关闭
core.symlinks


我可以不使用符号链接,但我希望有一个可用的存储库。有人知道一种方法(除了重新创建存储库)吗?

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

您可能需要备份到该提交,修复它,并在它之后重新提交所有内容
git-rebase-i
会有所帮助,但可能仍然不容易,特别是如果您在文件处于这种虚假的符号链接状态时对其进行了更多更改

假设错误提交是
abcdef123
,则需要执行以下操作:

git rebase -i 'abcdef123^'
这将使您进入一个编辑器,其中包含提交列表<代码>abcdef123应位于第一行。在该行上,将
选择
更改为
编辑
。如果存在多个错误提交,请将所有错误提交更改为
edit
。保存并退出编辑器

现在,您将回到提交坏文件的时间点。这是你改变历史的机会,纠正曾经出错的事情。使用检查提交

git show
并通过将原始符号链接路径名恢复到文件中并添加它来撤消坏的部分。或者您可以使用
git rm
正确地删除符号链接,然后创建一个新文件并
git添加该文件。如果选择第一个选项,请注意符号链接的内容只是一个路径名。它不是一个文本文件-它的结尾没有换行符。如果使用添加换行符的文本编辑器对其进行编辑,则会出现断开的符号链接(指向名称中包含换行符的文件)

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

git commit --amend
git rebase --continue
如果将多个提交从
pick
更改为
edit
,则必须对每个提交重复该过程。最后的
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的回购中做更多的工作。这只是自找麻烦

以上假设您希望该文件是一个文件而不是符号链接。如果它是一个符号链接,那么您应该在第一次提交后停止,删除tmp clone dir并返回正常的repo签出以创建符号链接并提交它


这种方法的好处是,在保存历史记录时,不会破坏任何相关的克隆和分支。这样做的缺点是,中断的提交仍然存在,如果任何人试图使用该特定的错误提交,都会给他们带来问题。

我遇到了这个问题,这为我解决了这个问题:

git config core.symlinks false
git rm <problem-file>
git commit <problem-file>
git push
git config core.symlinks true
git config core.symlinks错误
吉特rm
git提交
git推送
git config core.symlinks true

如果使用bitbucket,还有一种更简单的方法。由于现在bitbucket支持在线删除文件,您可以在bitbucket上访问您的回购协议,找到有问题的文件,按下“编辑”按钮和“删除”按钮附近的下拉按钮


这将删除符号链接已断开的文件,并且您又有了一个工作目录。如果这是一种可能性,那么它比手动重定基址和删除要快得多

我对少量文件也有同样的问题。我通过使用
git remove--cached
从存储库中删除它们来解决这个问题,它不会删除我源代码中的文件(不再是符号链接)。一旦全部删除,git会看到它们仍然存在,所以我可以使用
git add.
将它们添加回去,然后将它们提交回。现在git将它们视为普通文件。

如果可以,加上2