后台:我们目前有一个项目,需要将多个git
存储库克隆到单个父文件夹中。我尝试编写脚本,以便在所有子目录中运行git
操作,以便更轻松地管理(例如./gitall.sh status
/ add
/ {{1 } / reset
/ commit -m "Foobar"
/ etc。
该脚本适用于所有操作,直到我尝试执行push
我收到每个目录的错误./gitall.sh push
,因为有效命令是fatal: remote part of refspec is not a valid name in
(git -C somedir push "" "" "" ""
borks尾随双引号)。 N.B。参数需要双引号,以便用空格捕获参数。
gitall.sh
git
是否有双引号参数,只有它存在? (或者无论如何告诉find ./repo-* -type d -depth 0 -exec bash -c "git -C {} \"$1\" \"$2\" \"$3\" \"$4\" \"$5\"" \;
忽略尾随的双引号?)
答案 0 :(得分:3)
在bash中传递未知数量参数的正确方法是使用"$@"
。此外,您不需要显式调用bash
,因为它会使您引用参数的方式变得复杂。
这会自动引用所有参数:
#!/bin/bash
find ./repo-* -type d -depth 0 -exec git -C {} "$@" ';'
再多一步,如果您想要的只是当前级别的目录条目,则无需调用find
。匹配模式末尾的/
将仅选择目录:
#!/bin/bash
for d in repo-*/; do
[ -d "$d" ] && git -C "$d" "$@"
done
(注意,如果你没有任何匹配模式的目录,循环将使用文字参数repo-*/
执行一次; [ -d "$d" ]
将防止git被调用这种情况)。
最后,您可能需要考虑使用Google's repo
tool而不是自己的解决方案来管理多个git repos。它非常强大且易于使用。
答案 1 :(得分:2)
问题是你要向git push
传递额外的参数。每个""
由shell传递给git
,后者认为它获得7个参数,但最后4个是空字符串。
您正在寻找的是"$@"
。 "$@"
相当于"$1" "$2" ...
不需要所有额外的引用,也不需要bash -c
。 {shell}将扩展"$@"
。
另请注意,调用find不适用于GNU find,因此请使用BSD查找的完整路径。
#/bin/sh
/usr/bin/find ./repo-* -type d -depth 0 -exec git -C {} "$@" \;
答案 2 :(得分:1)
你在"$@"
之后,有更好的方法去做你正在做的事情:
find -name .git -prune -execdir git "$@" \;
你可以添加-maxdepth 1
或其他任何东西来限制find命令的进一步探索。