Git: no se puede crear un enlace simbólico (el nombre del file es demasiado largo)

Empujé un proyecto de Linux a Bitbucked y luego lo cloné en Windows. Resulta que había dos enlaces simbólicos, que aparecían como files de text en Windows. Como sabía a dónde deberían apuntar, los reemplacé por copys de sus files de destino, comprometidos y empujados.

Ahora el repository de butbucket se ve bien cuando lo miro desde su interfaz web. Sin embargo, un clon git en mi máquina Unix me da dos posts como:

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

y los dos files, que eran enlaces simbólicos previamente, están ausentes. Intenté clonar en / tmp / … para get nombres de file más cortos, pero obtuve los mismos resultados. Eso sugiere que algo salió mal con el repository bitbucket. Intenté core.symlinks y desactivar core.symlinks .

Puedo vivir sin los enlaces simbólicos, pero me gustaría tener un repository en funcionamiento. ¿Alguien sabe de qué forma (aparte de recrear el repository)?

Tan pronto como cambió el contenido de un file de enlace simbólico falso sin cambiar también su modo de enlace simbólico a file normal y confirmó el resultado, creó un blob que no se puede extraer en un sistema operativo con enlaces simbólicos reales, porque tiene una object que se supone que es un enlace simbólico, pero su contenido es demasiado largo para ser un nombre de ruta. La interfaz web no le está haciendo ningún favor al ocultar este problema.

Probablemente tengas que retroceder a esa confirmación, corregirla y volver a comprometer todo después de ella. git rebase -i ayudará, pero aún así puede no ser fácil, especialmente si ha realizado más cambios en los files mientras estaban en este falso enlace simbólico-pero-no-realmente-un-enlace simbólico.

Suponiendo que la confirmación incorrecta es abcdef123 , debe hacer esto:

 git rebase -i 'abcdef123^' 

que te pondrá en un editor con una list de commits. abcdef123 debe estar en la primera línea. En esa línea, cambie la pick para edit . Si hay más de una confirmación incorrecta, cámbiela a todas para edit . Guarde y salga del editor.

Ahora volverás al punto en el que cometiste el file incorrecto. Esta es su oportunidad de alterar la historia, corregir las cosas que alguna vez salieron mal. Inspeccione la confirmación con

 git show 

y deshacer la parte mala restaurando el nombre de ruta del enlace simbólico original en el file y git add . O podrías deshacerte del enlace simbólico correctamente con git rm , luego crea un nuevo file y git add that. Si elige la primera opción, tenga en count que el contenido de un enlace simbólico es solo una ruta de acceso. No es un file de text, no tiene una nueva línea al final. Si lo edita con un editor de text que agrega una nueva línea, tendrá un enlace simbólico roto (apuntando a un file con una nueva línea en su nombre).

Después de que hayas hecho tu git add , reinserta la confirmación fija en su lugar en la historia:

 git commit --amend git rebase --continue 

Si cambió varias confirmaciones de pick a edit , tendrá que repetir ese procedimiento para cada una. El último git rebase --continue lo llevará de vuelta al presente.

Si estás en una confirmación anterior durante la rebase y descubres que la confirmación completa es mala (no hizo nada más que replace un enlace simbólico con el contenido no modificado del file al que apunta), entonces puedes volver a git rebase --skip lugar de modificando y continuando. Si sabe de antemano que esto va a suceder, puede simplemente eliminar la confirmación incorrecta de la list git rebase -i lugar de cambiar su pick por edit .

Si tiene múltiples twigs afectadas por la (s) confirmación (es) incorrecta (s), tendrá que repetir todo el procedimiento para cada twig. Verifique una sucursal, ejecute git rebase -i hasta su finalización (que es cuando git rebase --continue dice " git rebase --continue éxito"), luego revise la siguiente sucursal y vuelva a hacerlo.

En el futuro, al dividir su trabajo de desarrollo entre Windows y un sistema operativo real, haga que Windows funcione con cygwin. Dentro de cygwin, los enlaces simbólicos son enlaces simbólicos y no puedes confundirlos como lo hiciste.

Aquí hay una solución que no requiere que regrese y corrija las confirmaciones. Después de todo, puede que no sea factible si el repository es remoto o compartido. Utiliza core.symlinks = false. Dijiste que probaste esto pero no dijiste cuándo. Debe hacerlo antes de la finalización de la compra, que un clon normal realiza de manera pnetworkingeterminada. Entonces debe clonar con la opción –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 # restre 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 

Ese último paso es importante porque no quiere hacer más trabajo en un repository con core.symlinks = false. Solo está buscando problemas.

Lo anterior supone que desea que el file sea un file, no un enlace simbólico. Si se suponía que era un enlace simbólico, pararía después de la primera confirmación, elimine el directory tmp-clone y vuelva a su process normal de repo para hacer el enlace simbólico y confirmarlo.

El beneficio de este método es que no se rompen clones y twigs relacionadas ya que preserva el historial. La desventaja de esto es que la confirmación rota todavía está allí y causará problemas a cualquiera si intentan usar esa mala confirmación particular.

Tuve este problema, esto lo resolvió para mí:

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

También hay una manera más fácil si está usando bitbucket. Como ahora bitbucket admite la eliminación en línea de los files, puedes ir a tu repository en bitbucket, encontrar el file problemático, presionar el button desplegable cerca del button "Editar" y "Eliminar".

Eso eliminará el file con enlace simbólico roto y tendrá nuevamente un directory de trabajo. si esta es una posibilidad, es mucho más rápido que rebasar y eliminar manualmente.