Глядя на хук перед фиксацией, у вас почти что-то вроде работает. Вот минимальные изменения, которые я считаю необходимыми:
#!/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 "$@"; 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
Вышеупомянутая реализация может обрабатывать любое имя файла, которое вы ей задаете.
person
src committer
schedule
22.10.2015