、あなたソルジャーをしたことがほとんどありました。
#!/bin/bash
files_modified=`git diff --cache --name-only --diff-filter=ACM`
### fix: use current branch; cached; and only files
for f in $files_modified; do ### broken: if space in filename(s)
if [[ $f == *.groovy ]]; then
line=$(head -1 $f) ### fix: forgot a $ before f
if [[ $line == "/%%*" ]];
then
sed -i 1d "$f" ### fix: forgot file argument
fi
echo "/%% " + $(date +"%m_%d_%Y") + " %%\\" >> $f
### fix: forgot a $ before f
git add -u $f ### fix: forgot a $ before f
fi
done
### undesired ### git commit --amend #recursive
### unneeded ### exit
ただし、私はあなたの実装にいくつかの問題があることに気付きました。ファイルの先頭から "/ %% *"と一致する行を削除し、新しい行を最後に追加します。これを実行するたびに、ファイルの末尾に新しい/%% mm_dd_YYYY %%\
行が永久に追加されます。それはあなたが望むものではないかもしれません(1000コミット後、空のファイルは1000行あります)。私はあなたがやっていたことは、既存のラインを置き換えることだったと思います。この場合、一致する行を置換するsed変換が機能します。ファイルの最初の行は前の時点で(/%% ... %%\
が、それが現在の日付/時刻に更新されて一致した場合
#!/bin/sh
TMPFILE="/tmp/${0##*/}.$$"
for f in $(git diff --cached --name-only --diff-filter=ACM); do
# XXX broken: if space in filename(s)
case "$f" in
*.groovy) : fall through ;;
*) continue
esac
cp "$f" "$TMPFILE" || continue
awk -v new="/%% $(date +%m_%d_%Y) %%\\" \
'NR==1{sub("^/%% .* %%\\\\$",new)}1' \
< "$TMPFILE" > "$f"
git add -u -- "$f"
done
:ここ
は、私はあなたが何を望むかに近づくと思うのレシピですコミットフック)。
しかし、これは単純にどのように行うことができるかを説明するためのものです。それは実際には完全な解決策ではありません。上記のスクリプトは、名前、二重引用符、バックスラッシュ、タブなどのスペースを含むファイルでは機能しません。完全なソリューションのために
:
使用以下、プリコミットフック:
#!/bin/sh
git diff --cached --name-only -z --diff-filter=ACM |
xargs -r0 .filters/myfilter
すると、次の内容で ".filters/myFilterを" を作成します。
#!/bin/sh
TMPFILE="/tmp/${0##*/}.$$"
for f in "[email protected]"; do ### the only difference from above recipe
case "$f" in
*.groovy) : fall through ;;
*) continue
esac
cp "$f" "$TMPFILE" || continue
awk -v new="/%% $(date +%m_%d_%Y) %%\\" \
'NR==1{sub("^/%% .* %%\\\\$",new)}1' \
< "$TMPFILE" > "$f"
git add -u -- "$f"
done
上記の実装あなたがそれに投げるファイル名を扱うことができます。