4

プロジェクトのいくつかのファイルを git に追加し、そのブランチを同期するための bash スクリプトがあります。正しい方法。

これは、ファイルが追加されるスクリプトのセクションです。

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'"

find を 1 回呼び出す方が、これらすべての個別のコマンドを使用するよりも高速かどうかはわかりませんが、このようにしたので、一部の種類のファイルを削除したり、新しいファイルを追加したりするのが簡単になりました。

コマンドを別の方法で使用するか、別のコマンドを使用することは完全に受け入れられる答えです。

4

5 に答える 5

6

git が 1 つのコマンドで複数のファイルの追加をサポートしている場合、最も簡単な方法は、+接尾辞 for を使用すること-execです。

find . -name '*.js' -exec git add {} \+

これにより、多数のファイルが収集され、それらすべてが 1 つのコマンド ラインでコマンドに渡されます。

したがって、実行されるのは次のとおりです。

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

数百または数千のファイルを処理している場合、これは実行時間に大きな違いをもたらします。

すべてのファイル パターンを 1 つのfindコマンドに結合するには、find の「or」演算子を使用します。

find . \( -name '*.js' -o   \
          -name '*.html' -o \
          -name '*.css' -o  \
          -name '*.py' -o   \
          -name '*.txt' -o  \
          -name '*.jpg' -o  \
          -name '*.sh' \) -exec git add {} +

\before(とは、)特別なシェルの意味からそれらを保護するために必要です。代わりに引用符を使用することもできます: '(', ')'.

findにはいくつかの複雑なオプションがあり、それらを習得して慣れるには少し苦労する必要がありますが、findファイルのフィルタリングに苦労するのではなく、複雑なコマンドを実行できるようになったことで、長年にわたって多くの労力を節約できましたgrep や awk などで名前を付けます。

興味のないファイルを無視しながら、maven/subversion Java プロジェクトをスキャンするための私の現在のお気に入りのパターンの 1 つは次のとおりです。

find . \( \( \( -iname .svn -o -iname target -o -iname classes \) -type d -prune -false \) -o \( <your filter expression> \) \) -exec grep -li xxx {} +
于 2012-11-09T23:19:00.960 に答える
4
find . \( -name '*.js'   -o \
          -name '*.html' -o \
          -name '*.css'  -o \
          -name '*.py'   -o \
          -name '*.txt'  -o \
          -name '*.jpg'  -o \
          -name '*.sh'   \) -exec git add {} +

これは、ディレクトリ構造を 1 回だけスキャンすることを意味します。これは、「複数findの s」を高速化する主な方法です。「複数」を「1」に置き換えます。これ+は に POSIX 2008 で追加されたものですが、それ自体ですべてのfindように動作します。利用できない場合は、 andxargsの使用を検討してください(または、名前に空白が含まれる可能性が高く、GNU andを使用している場合はandを使用しますが、それらがある場合は (おそらく — しかしコメントを参照してください)、表記も)。-printxargsfindxargs-print0xargs -0+

于 2012-11-10T00:19:02.583 に答える
2

このgit addコマンドは、他のシェルスクリプトなしでこれを実行できます。

git add -- '*.js' '*.html' '*.css' ...
于 2012-11-10T06:29:23.730 に答える
2

もし、あんたが

  • Bash4を持っている
  • 名前のみで検索しています(他の基準では検索していません)

これも使用できます:

shopt -s globstar
git add **/*.{js,html,css,py,txt,jpg,sh}


ノート:

  1. ブレース展開はファイル名展開の前に実行されるため、これは書き込みと同等です。

    git add **/*.js **/*.html etc...
    
  2. globstarキーワードを介して再帰的なファイル名拡張を有効にします**

于 2012-11-10T05:28:00.790 に答える
1

これはより速いかもしれません:

F='\.js$|\.html$|\.css$|\.py$|\.txt$|\.jpg$|\.sh$'
find . | egrep $F | xargs git add

または、ファイル名にスペースやその他の特殊文字が予想される場合は、そのバリエーション。

于 2012-11-09T23:24:25.860 に答える