我有一个bash脚本来添加项目的某些文件以git然后同步该分支,因为文件的数量增加了,我注意到脚本已经变得更慢了,所以我想弄清楚我是否以正确的方式做。
这是添加文件的脚本部分:
echo "Adding files..."
find . -name '*.js' -exec git add {} ;
find . -name '*.html' -exec git add {} ;
find . -name '*.css' -exec git add {} ;
find . -name '*.py' -exec git add {} ;
find . -name '*.txt' -exec git add {} ;
find . -name '*.jpg' -exec git add {} ;
find . -name '*.sh' -exec git add {} ;
echo "Commit"
git commit -m "'$1'"
我不确定要打一个单个呼叫是否比拥有所有这些分开的命令更快,但是我这样做了,因此删除某些类型的文件或添加新文件更简单。
我真的很感谢任何建议更有效的建议,以不同的方式使用命令或使用不同的命令是一个完全可以接受的答案。
如果git支持在一个命令中添加多个文件,那么您可以做的最简单的事情就是使用 +
for -exec
:
find . -name '*.js' -exec git add {} +
这会收集大量文件,并将它们全部传递给一个命令行中的命令。
所以执行的是:
git add a.js b.js c.js d.js
而不是
git add a.js
git add b.js
git add c.js
git add d.js
如果您正在处理数百或数千个文件,这将在执行时间上有很大的不同。
要将所有文件模式组合到单个find
命令中,请使用Find的"或"操作员:
find . ( -name '*.js' -o
-name '*.html' -o
-name '*.css' -o
-name '*.py' -o
-name '*.txt' -o
-name '*.jpg' -o
-name '*.sh' ) -exec git add {} +
需要和
)
之前的CC_4来保护它们免受特殊的外壳含义。您可以平均使用引号:'('
,')'
。
find
有一些复杂的选择,必须遇到一些麻烦来学习它们并熟悉它们,但多年来我通过能够撤离复杂的find
命令来节省了很多努力而不是努力通过Grep和Awk过滤文件名等等。
我目前喜欢的模式之一是通过Maven/Subversion Java项目扫描的同时忽略无趣的文件是:
find . ( ( ( -iname .svn -o -iname target -o -iname classes ) -type d -prune -false ) -o ( <your filter expression> ) ) -exec grep -li xxx {} +
find . ( -name '*.js' -o
-name '*.html' -o
-name '*.css' -o
-name '*.py' -o
-name '*.txt' -o
-name '*.jpg' -o
-name '*.sh' ) -exec git add {} +
这意味着您只扫描了一次目录结构,这是加速"多个find
S'的主要方式;您将"多个"替换为"一个"。+
是find
的POSIX 2008,但使其更像xargs
单独使用。如果您不可用,请考虑使用-print
和xargs
(或者,如果您可能有名称空白,并且您的GNU find
和xargs
,则是-print0
和xargs -0
,但是如果您有它们,则可能(可能 - 可能 - 可能 - 但请参见评论)也有+
表示法)。
如果您
- 有bash 4
- 仅按名称搜索(不是其他条件)
您也可以使用它:
shopt -s globstar
git add **/*.{js,html,css,py,txt,jpg,sh}
注意:
撑杆扩展是在文件名扩展之前执行的,因此等同于写作
git add **/*.js **/*.html etc...
globstar
通过关键字**
启用递归文件名扩展。
git add
命令可以执行此操作,而无需任何其他外壳脚本。
git add -- '*.js' '*.html' '*.css' ...
这可能更快:
F='.js$|.html$|.css$|.py$|.txt$|.jpg$|.sh$'
find . | egrep $F | xargs git add
或者如果您期望在文件名中的空间或其他特殊字符。