Как скопировать script список файлов со временем их изменения в mingw?

Отказ от ответственности: этот вопрос существует из-за Unity3D и его проблема с библиотекой.

Я попытался получить текущий git -cache-meta.sh и использовать его в окнах. Это не работает.

Первая ошибка, которую я получил, была в этой строке:

$ find `git ls-files`
find: invalid predicate `-'

Изменение его к оригиналу find $(git ls-files) также не работает (т.е. оба синтаксиса не подходят).

invalid predicate - это, конечно, файл с именем "boo - foo.bar". И поэтому я попытался запустить find "$(git ls-files)". Затем он превратился в очень уродливую ошибку/ошибку.

Я хочу знать, почему замена команд (странный $() не работает на mingw, но, что более важно:

Как мы можем сделать git-cache-meta.sh правильно на mingw?

Как вы можете видеть ниже, я действительно могу ответить на это без этого ключевого слова → правильно. Поэтому я все еще надеюсь, что кто-то может придумать быстрое и чистое решение - почему я использую этот script для начала.

Ответ 1

Оригинальный script был написан в элегантном и сложном стиле (возможно, более чем необходимо). Я переписал его с большей частью сложности. Я не знаю, какая функция разбивается на mingw, но это с большей вероятностью работает:

GIT_CACHE_META_FILE=.git_cache_meta
case [email protected] in
    --store)
        git ls-files|while read file; do
            find "$file" \( -printf 'chown %U %p\n' \) \
               \( -printf 'chgrp %G %p\n' \) \
               \( -printf 'chmod %#m %p\n' \) \
               \( -printf 'touch -c -d -m "%TY-%Tm-%Td %TH:%TM:%TS" "%p"\n' \)
        done | tee $GIT_CACHE_META_FILE
        ;;
    --apply)
        sh -e $GIT_CACHE_META_FILE
        ;;
    *)
        echo "Usage: $0 --store|--apply"; exit 1
        ;;
esac

Единственное, что может пойти не так, если один из исполняемых файлов в вашей системе не поддерживает все параметры, которые используются здесь. Это будет: find, chown, chgrp, touch и chmod.

Ответ 2

Я нашел большой и запутанный, таким образом, жесткий порт и медленное решение. Слишком медленно. Вааай слишком медленный. Потребуется минута, чтобы пройти через мой git, который содержит около 9k файлов. Но, тем не менее, вот он, благодаря Дэйву Тейлору, google и многим страницам man. В принципе, используйте for и Dave hack вместо find:

git ls-files -d > .temp_gitcachemeta
for s in $(git ls-files | grep -vf .temp_gitcachemeta | sed 's/ /_+_/g');
    do t="$(echo $s | sed s'/_+_/ /g')";
    echo "touch -c -m -d \"$(date -r "$t" +'%F %T')\" \"$t\"";
done
rm .temp_gitcachemeta ;;

Использование временного файла здесь, потому что похоже, что mingw также не поддерживает замещение процесса.

Ответ 3

MinGW любит называть собственные инструменты Windows, которые добавляют возврат каретки (CR, \r) в конец каждой строки. Таким образом, вы можете заменить $(commandname) на $(commandname | sed $'s/\r$//') или что-то подобное.

Другой вариант - попробовать что-то еще Unix-y, такое как Interix/SFU/SUA или Cygwin или MSYS или AT & T UWIN.

Что касается метаданных в целом, ваша проблема будет заключаться в том, что такие вещи, как chown, chgrp, chmod и touch будут вести себя по-разному на платформе Windows®, а некоторые вещи даже не будут существовать, особенно на FAT, тогда как NTFS имеет совершенно другой набор метаданных (разные форматы для штампов времени, ACL вместо пользовательских/групповых/других разрешений Unix и т.д.), Поэтому он может потребовать некоторых разработок от тех, кто понимает мир сценариев Unix и платформа NT хорошо.

Наконец, Id хотел бы сказать, что этот script является дырой в безопасности, поскольку он просто оценивает сохраненные команды, поэтому, если кто-либо еще имеет возможность писать в файл .git_cache_meta, они будут владеть вашей системой.