跟踪Git中的文件权限。运行git缓存元时出错:“0”;查找:您有太多';)'&引用;

跟踪Git中的文件权限。运行git缓存元时出错:“0”;查找:您有太多';)'&引用;,git,shell,Git,Shell,我目前正在尝试实现在进行Git克隆时能够保留文件权限。但是,当我运行命令时,我收到了这个错误 $ git-cache-meta.sh --store find: you have too many ')' 之前的一个错误是Git列出了太多的文件(我正在跟踪大约2.5GB的文件,据我所知,这些文件已经超出了单个Git项目的限制) shell脚本的初始化是否有问题(我使用了下面列出的主代码: 但我没有使用任何修订,这些修订似乎是针对不同的问题)。该页面上报告的几个错误似乎与文件名中的特定字符有关,

我目前正在尝试实现在进行Git克隆时能够保留文件权限。但是,当我运行命令时,我收到了这个错误

$ git-cache-meta.sh --store
find: you have too many ')'
之前的一个错误是Git列出了太多的文件(我正在跟踪大约2.5GB的文件,据我所知,这些文件已经超出了单个Git项目的限制)

shell脚本的初始化是否有问题(我使用了下面列出的主代码:

但我没有使用任何修订,这些修订似乎是针对不同的问题)。该页面上报告的几个错误似乎与文件名中的特定字符有关,但仔细查看,我找不到任何可能导致我收到错误的“(”或“)

但是,如果它与试图跟踪过多文件有关,那么在Git中部署文件时,是否有关于维护文件权限和所有者元数据的建议?

尝试以下方法:

function get_metadata {
    git ls-files | 
    xargs stat -c $'%a\t%U\t%G\t%x\t%n' | 
    while IFS=$'\t' read -r perm user grp date name; do 
        echo chown "$user" "$name"
        echo chgrp "$grp" "$name"
        echo chmod "$perm" "$name"
        echo touch -c -d "'$date'" "$name"
    done
}

case $1 in
    --stdout) get_metadata ;;
    --store)  get_metadata > "$GIT_CACHE_META_FILE" ;;
    --apply)
        [[ -f "$GIT_CACHE_META_FILE" ]] &&
        sh "$GIT_CACHE_META_FILE"
        ;;
    *) echo "usage: ..." ;;
esac

这假设您的所有文件名都不包含换行符。

如果将
set-x
添加到该脚本中,您会看到find命令有什么变化?对不起,我对shell命令不是很熟悉,但我应该在哪一行添加它?在
find
命令之前的任何地方都可以。使shebang行
-ex
也适用于这种情况。
function get_metadata {
    git ls-files | 
    xargs stat -c $'%a\t%U\t%G\t%x\t%n' | 
    while IFS=$'\t' read -r perm user grp date name; do 
        echo chown "$user" "$name"
        echo chgrp "$grp" "$name"
        echo chmod "$perm" "$name"
        echo touch -c -d "'$date'" "$name"
    done
}

case $1 in
    --stdout) get_metadata ;;
    --store)  get_metadata > "$GIT_CACHE_META_FILE" ;;
    --apply)
        [[ -f "$GIT_CACHE_META_FILE" ]] &&
        sh "$GIT_CACHE_META_FILE"
        ;;
    *) echo "usage: ..." ;;
esac