如何使用mingw上的修改时间来编写脚本文件列表?

时间:2013-07-23 15:13:15

标签: git shell find mingw

免责声明:由于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 ,但更重要的是:

  

我们如何在mingwgit-cache-meta.sh正确正确

正如您在下面看到的,我实际上设法在没有该关键字的情况下回答这个问题 - >的 正确 即可。所以我仍然希望有人可以提出一个快速而干净的解决方案< - 我开始使用这个脚本的原因。

3 个答案:

答案 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。

对于一般的元数据,您的问题是chownchgrpchmodtouch等内容在Windows®平台上的行为会有所不同,有些事情甚至不会存在,特别是在FAT文件系统上,而NTFS有一组完全不同的元数据(时间戳的格式不同,ACL而不是Unix用户/组/其他权限等),所以它可能需要一些开发工作来自能够很好地理解Unix脚本世界 NT平台的人。

最后,我想说这个脚本是一个安全漏洞,因为它只是评估存储的命令,所以如果其他人有能力写入.git_cache_meta文件,他们将拥有你的系统。