私はgit commit Hookを書いて、というリポジトリでテストしましたmyrepo
。それでは、~/repos
フォルダ内のすべてのリポジトリにコピーしたいと思います。そのために、私は以下を試しました。
$ cd ~/repos/myrepo/.git/hooks
$ cp prepare-commit-msg ~/repos/*/.git/hooks
これを実行すると、cp
各ディレクトリに次のメッセージが表示されますrepos
。
cp: -r not specified; omitting directory <directory-name>
prepare-commit-msg
私はこれがディレクトリではないと100%確信しています。なぜcp
私はそれを使用しなかったと文句を言うのですか-r
?
答え1
find
それはあなたが探しているツールかもしれません。これを使用して指定され、フォルダhooks
の下にあるすべてのディレクトリを見つけることができます~/repos/
。見つかったディレクトリごとにfind
ファイルをコピーするように指示します。
myrepo
これにより、リポジトリがファイルを自分自身にコピーしようとするとエラーメッセージが表示されますが、エラーは無視できます。
cd ~/repos/myrepo/.git/hooks
find ~/repos/ -type d -name hooks -exec cp -vp prepare-commit-msg {} \;
このコマンドは、ディレクトリまたはファイル名に奇妙な文字がある場合を処理するように改善することができますが、これは重要です。
元cp
のコマンドが機能しない理由についてよりよく説明する質問があるかもしれませんが、これはシェルがコマンドを次のように拡張するためです。
cp prepare-commit-msg ~/repos/repo_A/.git/hooks ~/repos/repo_B/.git/hooks ~/repos/repo_C/.git/hooks ~/repos/repo_D/.git/hooks ~/repos/repo_E/.git/hooks
その構文が与えられたら、cp
ファイルprepare-commit-msg
と4つのディレクトリをコピーし、コピーされたすべての~/repos/repo_A/.git/hooks
ファイル~/repos/repo_D/.git/hooks
/ディレクトリを~/repos/repo_E/.git/hooks
。 t ディレクトリを再帰的にコピーします。cp
-r
元の構文に似たソリューションを構築するには、次のものを使用できます。
cd ~/repos/myrepo/.git/hooks
dirs=( ~/repos/*/.git/hooks )
for d in "${dirs[@]}"
do
cp -vp prepare-commit-msg "$d/"
done
答え2
cp
独自のラッパーを使用できますcp2dirs
。
function cp2dirs(){
from="$1";shift
[ -f "$from" ] && while (($#)); do cp "$from" "$1/"; shift; done
}
そしてcp2dirs prepare-commit-msg ~/repos/*/.git/hooks
何