Cómo usar los enlaces simbólicos creados por Windows git con Cygwin

Estoy usando Jenkins en una máquina con Windows para build un progtwig Cygwin. Recientemente eso comenzó a fallar.

Resulté que era porque Windows ' git parece representar enlaces simbólicos en el repository como files de text sin formatting.

Hay dos enfoques posibles para resolver esto:

  1. Usa el git de Cygwin para hacer el pago.
  2. Convierte los enlaces (también conocidos como files de text sin formatting) a los enlaces de Cygwin

El primero resultó no ser tan simple como yo deseaba, señalando que el git.exe de Cygwin no era suficiente ya que necesitamos cygwin1.dll en la ruta. Este y algunos otros asuntos me hicieron abandonar este enfoque. Estoy interesado en sugerencias sobre cómo hacer eso, en esencia convirtiendo a un Windows Jenkins en un Cygwin Jenkins.

Sin embargo, parecía factible convertir los "enlaces" de Windows git en enlaces de Cygwin. ¿Cuál sería una manera simple de hacer eso y podría ejecutarse como un primer paso en la compilation de Jenkins?

Escribí un script bash simple para encontrar todos los "enlaces", fácil ya que están marcados con banderas 120000 según esta respuesta . Luego, fue una simple cuestión simplemente recoger el nombre del file de destino (el contenido del file de text) y luego replace el file con un enlace simbólico.

Como es un script bash, puede usarse fácilmente desde Cygwin y MSys.

 #!/bin/bash # # http://sofes.miximages.com/a/38140374/204658 # # Script to convert symbolic links created by a windows git # clone/checkout to cygwin links. When a typical Windows git checks # out a symbolic link from the repo it (MsysGit, at least) tend to # produce text files with flag 120000 and the link target file name as # the content. Strategy would simply be to find all those and replace # by cygwin links. # # This will work if you are not planning on commiting anything, eg # in a Jenkins, or other CI, build environment for f in `git ls-files -s | awk '$1 == "120000" {print $4}'` do # echo $f is a symlink pointing to $dir/$target dir=$(dirname "${f}") pushd "$dir" 2>&1 > /dev/null file=$(basename "$f") target=`cat "$file"` rm "$file" ln -s "$target" "$file" popd 2>&1 > /dev/null done