
エイリアスを追加できないようです。git add **/
2つのアスタリスクが問題を引き起こしているようです。それとも、スラッシュによるものかもしれません。この問題をどのように解決できますか?
これまで私は試しました
alias ga='git add **/'
端末で上記のエイリアスを実行したときにga somename.java
エイリアスが存在しない場合と同じコマンドを実行しますgit add **/somename.java
。
また、アスタリスク、スラッシュ、ドル記号、引用符などを追加してみました。
答え1
ga somename.java
うん、短縮git add **/ somename.java
。エイリアスの最初のパラメータは、エイリアス内の最後の単語には関連付けられません。こう考えてみてください。入力したスペースはga
削除されません。
コマンドの代替名を指定したり、コマンドにパラメーターを渡したりするよりも複雑な操作を実行するには、エイリアスの代わりに関数を使用してください。
これはzshの非常に多様なバージョンです。
function ga {
git add **/$^~@(.N)
}
alias ga='noglob ga'
動作方法は次のとおりですga foo* bar
。
- エイリアス
ga
はnoglob ga
。 - ありがとう
noglob
辞書コマンド修飾子のnoglob ga foo* bar
ワイルドカード文字は拡張されませんが、foo*
文字通りfoo*
引数として渡されますga
。 - (中のもの)は、コマンドの最初の単語
ga
ではないため、別名で照会されないため、引数noglob ga …
で呼び出された関数を参照します。foo*
bar
$^~@
使用${^spec}
および${~spec}
パラメータ拡張形式。修飾子は配列の各要素の前に追加され、^
合計が生成されます。この修飾子がない場合は、およびに展開されます。**/
$@
**/foo*
**/bar
**/$@
**/foo*
bar
$~@
これで引数のワイルドカード文字が拡張されます。このように、パターンはそれ自体foo*
拡張されません。つまり**/foo*
、次の項目と一致しますsub/dir/foobar
。- これ
.
グローバル予選通常のファイルのみが一致します。-.
通常のファイルとシンボリックリンクを一致させるか、@.
通常のファイルに加えてすべてのシンボリックリンクを一致させます。 - これ
N
グローバル予選一致しないパターンは無視されます。(N)
パターンの1つが何も一致しないときにエラーが発生するようにするには、そのパターンを入力しないでください。
ここで欠けている唯一の利点は完成です。実現可能しかし、ここでは苦労する価値がないと思います。
Bashではそれほど良い結果は得られません。ワイルドカードがすぐに拡張され、ディレクトリの内容ga foo*
と同じになるのを防ぐ方法はありません。ga foo1 foo2
.git …
foo1
foo2
subdir
subdir/foobar
どうすれば見逃すことができますかsubdir/foobar
?
Bashでは引数にワイルドカードを引用する必要があるので、Gitの独自のパターンマッチングに頼ることをお勧めします。パス指定。ディレクトリ区切り記号を一致させるために特別な注意を払ってください。つまり、*
シェル動作が組み込まれています。**
function ga {
local x
for x in "$@"; do
git add "*/$x"
done
}
ga 'foo*' bar
最後に、.gitignore
最新の情報を維持し、頻繁にコミットする場合git add .
。
答え2
find
シェルextglobに完全に依存するのではなく、再帰検索を実行して実行するように指示できます。git add
ga() {
local -a find_args
local arg
for arg in "$@"; do
find_args+=( -o -name "$arg" )
done
find . '(' -false "${find_args[@]}" ')' -exec git add -- {} +
}