加快bash脚本将git repo转换为LFS的速度

加快bash脚本将git repo转换为LFS的速度,git,bash,shell,sed,git-lfs,Git,Bash,Shell,Sed,Git Lfs,我正在尝试将git存储库转换为lfs。我正在试用这个bash脚本,注意到它非常慢。有人知道如何加快速度吗?我不是真的参加这个聚会 git filter-branch --prune-empty --tree-filter ' git lfs track "*.psd" git lfs track "*.jpg" git lfs track "*.png" git add .gitattributes git ls-files -z | xargs -0 git check-attr filte

我正在尝试将git存储库转换为lfs。我正在试用这个bash脚本,注意到它非常慢。有人知道如何加快速度吗?我不是真的参加这个聚会

git filter-branch --prune-empty --tree-filter '
git lfs track "*.psd"
git lfs track "*.jpg"
git lfs track "*.png"
git add .gitattributes 
git ls-files -z | xargs -0 git check-attr filter | grep "filter: lfs" | sed -E "s/(.*): filter: lfs/\1/" | tr "\n" "\0" | while read -r -d $'"'\0'"' file; do
    echo "Processing ${file}"
    git rm -f --cached "${file}"
    echo "Adding $file lfs style"
    git add "${file}"
done
' --tag-name-filter cat -- --all
考虑更换

while read -r -d $'"'\0'"' file; do
    echo "Processing ${file}"
    git rm -f --cached "${file}"
    echo "Adding $file lfs style"
    git add "${file}"
done

xargs -0 sh -c '
  printf "Processing file: %s\n" "$@"
  git rm -f --cached "$@" && git add "$@"
' _
这样,您就不用为每个文件调用一次
git rm
git add
,而是只为每组文件调用一次这两个工具,最大大小为环境变量和命令行长度之间共享的可用空间所能容纳的最大大小


我还建议将
git lfs track
命令组合到一个调用中。例如,如果您阅读,您将看到它支持以下用法:

git lfs track "*.psd" "*.jpg" "*.png"

@托马斯:谢谢你编辑代码,现在看起来好多了。对不起,如果我做错了什么,我是新来的。我对每一个帮助都很满意。一个简短的提示——你最好运行一个
git rm-f
和一个
git add
,每个文件上都有一堆文件名,而不是每个文件运行一次命令。
tr
很愚蠢:如果你已经有新行,在开始阅读之前将其更改为NUL并不能使事情变得更好/更安全……而且在C样式的字符串中不能有一个文本NUL,这是bash所使用的,因此您对
read-d
的使用与您期望的方式不符。只要
IFS=read-r-d''
就足以读取NUL分隔的字符串:使用字符串的第一个字符,C样式空字符串的第一个字符是NUL。(
-r
防止文本反斜杠被屏蔽,而
IFS=
防止尾随空格被删除)。此外,与
grep | sed
不同,我会考虑使用一个单一的AWK命令来完成这两项工作——在管道级之间阻抗不匹配的可能性较小,这样会导致麻烦。好的,谢谢您的回复。我明天会试试,并给你更多关于节省时间的反馈。我非常感谢你的帮助。