Как скопировать 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, они будут владеть вашей системой.