Created
June 24, 2025 14:12
-
-
Save nikgalushko/caf31e70e67a42e5b3391e15dd4f72af to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Получаем текущую дату | |
TODAY=$(date +%Y-%m-%d) | |
# Получаем email текущего пользователя из git config | |
USER_EMAIL=$(git config user.email) | |
USER_NAME=$(git config user.name) | |
if [ -z "$USER_EMAIL" ]; then | |
echo "Ошибка: не удалось получить email из git config" | |
echo "Установите его командой: git config user.email '[email protected]'" | |
exit 1 | |
fi | |
# Создаем директорию для diff файлов | |
OUTPUT_DIR="my_diffs_${TODAY}" | |
mkdir -p "$OUTPUT_DIR" | |
echo "Сбор коммитов за $TODAY" | |
echo "Автор: $USER_NAME <$USER_EMAIL>" | |
echo "Выходная директория: $OUTPUT_DIR" | |
echo "================================================" | |
# Флаг для отслеживания найденных коммитов | |
FOUND_COMMITS=false | |
# Получаем список только локальных веток | |
git for-each-ref --format='%(refname:short)' refs/heads | while read branch; do | |
# Получаем только СВОИ коммиты за сегодня в текущей ветке | |
COMMITS=$(git log "$branch" --author="$USER_EMAIL" --since="$TODAY 00:00:00" --until="$TODAY 23:59:59" --format="%H" 2>/dev/null) | |
if [ ! -z "$COMMITS" ]; then | |
FOUND_COMMITS=true | |
# Создаем безопасное имя файла из имени ветки | |
SAFE_BRANCH_NAME=$(echo "$branch" | sed 's/[^a-zA-Z0-9._-]/_/g') | |
DIFF_FILE="$OUTPUT_DIR/diff_${SAFE_BRANCH_NAME}.txt" | |
echo "Обработка ветки: $branch" | |
# Заголовок файла | |
{ | |
echo "================================================" | |
echo "Ветка: $branch" | |
echo "Автор: $USER_NAME <$USER_EMAIL>" | |
echo "Дата: $TODAY" | |
echo "================================================" | |
echo "" | |
} > "$DIFF_FILE" | |
# Количество коммитов | |
COMMIT_COUNT=$(echo "$COMMITS" | wc -l) | |
echo " Найдено ваших коммитов: $COMMIT_COUNT" | |
# Добавляем список коммитов | |
{ | |
echo "МОИ КОММИТЫ:" | |
echo "------------" | |
git log "$branch" --author="$USER_EMAIL" --since="$TODAY 00:00:00" --until="$TODAY 23:59:59" \ | |
--format=" %h | %ad | %s" --date=format:"%H:%M:%S" | |
echo "" | |
echo "================================================" | |
echo "ИЗМЕНЕНИЯ:" | |
echo "================================================" | |
echo "" | |
} >> "$DIFF_FILE" | |
# Получаем самый ранний и последний коммиты | |
EARLIEST_COMMIT=$(echo "$COMMITS" | tail -1) | |
LATEST_COMMIT=$(echo "$COMMITS" | head -1) | |
# Для корректного diff нужно найти базовый коммит | |
# Это последний коммит перед нашими изменениями | |
BASE_COMMIT=$(git log "$branch" --before="$TODAY 00:00:00" --format="%H" -n 1 2>/dev/null) | |
if [ -z "$BASE_COMMIT" ]; then | |
# Если коммитов до сегодня нет, берем родителя самого раннего коммита | |
BASE_COMMIT=$(git rev-parse "$EARLIEST_COMMIT^" 2>/dev/null) | |
fi | |
if [ ! -z "$BASE_COMMIT" ]; then | |
# Создаем diff от базового коммита до последнего нашего коммита | |
git diff "$BASE_COMMIT..$LATEST_COMMIT" >> "$DIFF_FILE" | |
else | |
# Если базового коммита нет, используем diff от пустого дерева | |
git diff $(git hash-object -t tree /dev/null).."$LATEST_COMMIT" >> "$DIFF_FILE" | |
fi | |
# Добавляем статистику | |
{ | |
echo "" | |
echo "================================================" | |
echo "СТАТИСТИКА:" | |
echo "================================================" | |
if [ ! -z "$BASE_COMMIT" ]; then | |
git diff --stat "$BASE_COMMIT..$LATEST_COMMIT" | |
else | |
git diff --stat $(git hash-object -t tree /dev/null).."$LATEST_COMMIT" | |
fi | |
} >> "$DIFF_FILE" | |
echo " ✓ Сохранено в: $DIFF_FILE" | |
echo " Размер файла: $(du -h "$DIFF_FILE" | cut -f1)" | |
echo "" | |
fi | |
done | |
# Создаем сводку только по своим коммитам | |
SUMMARY_FILE="$OUTPUT_DIR/MY_SUMMARY.txt" | |
{ | |
echo "================================================" | |
echo "МОИ КОММИТЫ ЗА $TODAY" | |
echo "Автор: $USER_NAME <$USER_EMAIL>" | |
echo "================================================" | |
echo "" | |
# Статистика по веткам | |
echo "ВЕТКИ С МОИМИ ИЗМЕНЕНИЯМИ:" | |
echo "--------------------------" | |
for diff_file in "$OUTPUT_DIR"/diff_*.txt; do | |
if [ -f "$diff_file" ]; then | |
BRANCH_NAME=$(grep "^Ветка: " "$diff_file" | head -1 | cut -d' ' -f2-) | |
COMMIT_COUNT=$(grep -E "^ [a-f0-9]{7} \|" "$diff_file" | wc -l) | |
FILE_SIZE=$(du -h "$diff_file" | cut -f1) | |
echo "- $BRANCH_NAME: $COMMIT_COUNT коммитов ($FILE_SIZE)" | |
fi | |
done | |
echo "" | |
echo "ВСЕ МОИ КОММИТЫ ЗА ДЕНЬ:" | |
echo "------------------------" | |
git log --all --author="$USER_EMAIL" --since="$TODAY 00:00:00" --until="$TODAY 23:59:59" \ | |
--format="%h | %ad | %d | %s" --date=format:"%H:%M:%S" | sort -k2 | |
echo "" | |
echo "СТАТИСТИКА ПО ФАЙЛАМ:" | |
echo "--------------------" | |
git log --all --author="$USER_EMAIL" --since="$TODAY 00:00:00" --until="$TODAY 23:59:59" \ | |
--format="" --numstat | awk '{if ($1 != "" && $2 != "") {add+=$1; del+=$2; files[$3]++}} END {print "Добавлено строк: +"add; print "Удалено строк: -"del; print "Изменено файлов: "length(files)}' | |
} > "$SUMMARY_FILE" | |
# Проверяем результаты | |
DIFF_COUNT=$(find "$OUTPUT_DIR" -name "diff_*.txt" -type f | wc -l) | |
if [ $DIFF_COUNT -gt 0 ]; then | |
echo "================================================" | |
echo "✓ Обработка завершена!" | |
echo "Создано diff файлов: $DIFF_COUNT" | |
echo "Все файлы сохранены в: $OUTPUT_DIR/" | |
echo "Сводка: $SUMMARY_FILE" | |
TOTAL_SIZE=$(du -sh "$OUTPUT_DIR" | cut -f1) | |
echo "Общий размер: $TOTAL_SIZE" | |
else | |
echo "За сегодня ($TODAY) ваших коммитов не найдено." | |
rm -rf "$OUTPUT_DIR" | |
fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment