在我的家用计算机上,我使用该脚本gitpull.sh
同时将所有更改拉取到给定目录下的 git 存储库。
#!/usr/bin/bash
find $1 -name ".git" | sed -r 's|/[^/]+$||' | parallel git -C {} pull origin master
我的问题是parallel
我的工作计算机上没有安装该软件。是否可以在不使用 的情况下更改我的脚本parallel
?
答案1
您可以使用带有 -P 标志的 xargs 来代替并行。就像是:
find $1 -name ".git" | sed -r 's|/[^/]+$||' | xargs -I {} -n 1 -P 0 git -C {} pull origin master
答案2
答案3
您可以仅使用 bash、readlink 和 find 来完成此操作:
#!/bin/bash
while IFS= read -d '' -r g ; do
dir="$(readlink -f "$g/..")"
git pull -C "$dir" origin master &
done < <(find "$@" -name '.git' -print0)
仔细使用 find-maxdepth
选项可以让它运行得更快一些。例如,如果您知道.git
将找到所有目录仅有的在当前目录的顶级子目录中,-maxdepth 3
将阻止它递归到任何较低的子目录。
我使用的"$@"
是命令find
而不是$1
您使用的未加引号的命令,因此不仅目录参数是可选的,您还可以使用多个目录参数和/或将您可能需要的任何查找选项添加到命令行。
如果您的工作计算机上的版本find
不这样做-print0
,您可以使用\n
作为输入分隔符,但如果任何目录名称包含换行符(这种情况不常见但完全有效),脚本将中断。
while IFS= read -r g ; do
dir="$(readlink -f "$g/..")"
git pull -C "$dir" origin master &
done < <(find "$@" -name '.git')