免责声明:由于Unity3D and its library issue而存在此问题。
我尝试过current git-cache-meta.sh并在Windows上使用它。它不起作用。
我得到的第一个错误是在这一行:
$ find `git ls-files`
find: invalid predicate `-'
将其更改为原始find $(git ls-files)
也不起作用(即两种语法都不合适)。
invalid predicate
肯定是由于名为"boo - foo.bar"
的文件所致。所以我试着运行find "$(git ls-files)"
。然后它变成了very ugly error/bug。
我想知道为什么command substitution(奇怪的$(
)不能用于 mingw ,但更重要的是:
我们如何在mingw上
git-cache-meta.sh
正确正确?
正如您在下面看到的,我实际上设法在没有该关键字的情况下回答这个问题 - >的 正确 即可。所以我仍然希望有人可以提出一个快速而干净的解决方案< - 我开始使用这个脚本的原因。
答案 0 :(得分:1)
我发现了一个庞大且复杂的,因此难以移植和缓慢的解决方案。太慢了。 Waaaay太慢了。花一点多时间来浏览我的git,它有大约9k文件。但是,尽管如此,thanks to Dave Taylor,谷歌和许多手册页。基本上,使用for
和Dave的黑客而不是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似乎也不支持process substitution。
答案 1 :(得分:1)
原始剧本以优雅而复杂的风格编写(可能比必要的更多)。我重写了它,删除了大部分复杂性。我不知道哪个功能在mingw上打破,但这更有可能奏效:
GIT_CACHE_META_FILE=.git_cache_meta
case $@ 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 :(得分:0)
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平台的人。
最后,我想说这个脚本是一个安全漏洞,因为它只是评估存储的命令,所以如果其他人有能力写入.git_cache_meta文件,他们将拥有你的系统。