Skip to content

Instantly share code, notes, and snippets.

@nikgalushko
Created June 24, 2025 14:12
Show Gist options
  • Save nikgalushko/caf31e70e67a42e5b3391e15dd4f72af to your computer and use it in GitHub Desktop.
Save nikgalushko/caf31e70e67a42e5b3391e15dd4f72af to your computer and use it in GitHub Desktop.
#!/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