2016-07-01 2 views
1

Я использую Jenkins на компьютере под Windows для создания программы Cygwin. Недавно это начало проваливаться.Как использовать символические ссылки, созданные Windows git с помощью Cygwin

Я оказался так потому, что Windows git, по-видимому, представляет собой символические ссылки в репо в виде текстовых файлов.

Есть два возможных подхода к решению этого:

  1. Использование Cygwin-х git сделать проверку.
  2. Преобразование ссылки (А.К.А. текстовые файлы) для Cygwin ссылки

Первый оказался не так просто, как я хотел, указывая на Cygwin-х git.exe не было достаточно, как нам нужно cygwin1.dll в пути. Это и некоторые другие проблемы заставили меня отказаться от этого заявления. Меня интересуют предложения о том, как это сделать, по существу превращая Windows Jenkins в Cygwin Jenkins.

Однако поворот окон git «ссылки» на ссылки Cygwin казался выполнимым. Что было бы простым способом сделать это и можно было бы запустить как начальный шаг в сборке Jenkins?

ответ

2

Я написал простой сценарий bash, чтобы найти все «ссылки», так как они отмечены знаками 120000 в соответствии с this answer. Тогда просто было просто выбрать целевое имя файла (содержимое текстового файла), а затем заменить файл символической ссылкой.

Поскольку это скрипт bash, его можно легко использовать из Cygwin и MSys.

#!/bin/bash 
# 
# https://stackoverflow.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, e.g. 
# 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 
+0

Вы можете сделать ваше использование AWK '^ 120000' или' $ 1 == «120000» 'как тест, так что он не будет срабатывать на файлах, чьи хэш происходит содержать' 120000' или чье имя содержит '120000'. (Вы также можете столкнуться с проблемами с именами файлов, которые содержат пробелы, но это немного сложнее работать с простыми сценариями.) – torek

+0

Спасибо, @torek, обновленный скрипт с '$ 1 =" 120000 "и более кавычками для облегчения пространства проблемы. – thoni56

+0

Увы, '$ 4' в awk уже искал бы пробельное имя. (Вот почему 'git ls-files' имеет' -z', но для использования этой опции вам нужно быть довольно сумасшедшим с помощью специальных трюков Bash или написать все на Python, или некоторые такие ... Без '- z' Git кодирует пробелы, возможно, используя 'read' в Bash будет работать?) – torek