
개발자들 사이에서 유명한 GitHub 잔디 심기 프로필에 초록색 잔디밭을 만들어보는 방법을 정리해보았습니다.
GitHub에서 잔디가 심어지려면 몇 가지 조건이 있습니다:
이미 지나간 날짜에도 잔디를 심을 수 있습니다! Git의 환경변수를 활용하는 방법입니다.
# 특정 날짜에 커밋 생성
GIT_AUTHOR_DATE=2024-01-01T12:00:00 GIT_COMMITTER_DATE=2024-01-01T12:00:00 \
git commit --allow-empty -m "past commit"
# 여러 날짜에 커밋
GIT_AUTHOR_DATE=2024-01-15T12:00:00 GIT_COMMITTER_DATE=2024-01-15T12:00:00 \
git commit --allow-empty -m "commit 1"
GIT_AUTHOR_DATE=2024-02-01T12:00:00 GIT_COMMITTER_DATE=2024-02-01T12:00:00 \
git commit --allow-empty -m "commit 2"
# 더 간단한 방법
git commit --allow-empty -m "past commit" --date="2024-01-01"
git commit --allow-empty -m "past commit" --date="2024-01-01T12:00:00"
매번 수동으로 하기 힘드니까 자동화 스크립트를 만들어보았습니다.
#!/bin/bash
echo "GitHub grass planting started (Jan 1, 2024 ~ Jul 29, 2025)"
echo "=================================================="
# 2024년 심기 (1월 1일 ~ 12월 31일)
echo "Processing 2024..."
for month in {1..12}
do
# 각 월의 마지막 날 계산
case $month in
1|3|5|7|8|10|12) days=31 ;;
4|6|9|11) days=30 ;;
2) days=29 ;; # 2024년은 윤년
esac
for day in $(seq 1 $days)
do
date="2024-$(printf "%02d" $month)-$(printf "%02d" $day)"
# 랜덤하게 70% 확률로 커밋 (너무 빽빽하지 않게)
if [ $((RANDOM % 10)) -lt 7 ]; then
# 랜덤 커밋 개수 (1-5개)
commits=$((RANDOM % 5 + 1))
for i in $(seq 1 $commits)
do
hour=$((RANDOM % 24))
minute=$((RANDOM % 60))
time="${date}T$(printf "%02d" $hour):$(printf "%02d" $minute):00"
GIT_AUTHOR_DATE="$time" GIT_COMMITTER_DATE="$time" \
git commit --allow-empty -m "Auto commit $date #$i"
done
echo "Done: $date - $commits commits"
else
echo "Skip: $date - rest day"
fi
done
done
# 2025년 심기 (1월 1일 ~ 7월 29일)
echo "Processing 2025..."
for month in {1..7}
do
# 각 월의 마지막 날 계산 (7월은 29일까지만)
case $month in
1|3|5|7)
if [ $month -eq 7 ]; then
days=29 # 7월은 29일까지만
else
days=31
fi
;;
4|6) days=30 ;;
2) days=28 ;; # 2025년은 평년
esac
for day in $(seq 1 $days)
do
date="2025-$(printf "%02d" $month)-$(printf "%02d" $day)"
# 랜덤하게 70% 확률로 커밋
if [ $((RANDOM % 10)) -lt 7 ]; then
# 랜덤 커밋 개수 (1-5개)
commits=$((RANDOM % 5 + 1))
for i in $(seq 1 $commits)
do
hour=$((RANDOM % 24))
minute=$((RANDOM % 60))
time="${date}T$(printf "%02d" $hour):$(printf "%02d" $minute):00"
GIT_AUTHOR_DATE="$time" GIT_COMMITTER_DATE="$time" \
git commit --allow-empty -m "Auto commit $date #$i"
done
echo "Done: $date - $commits commits"
else
echo "Skip: $date - rest day"
fi
done
done
echo "=================================================="
echo "Grass planting completed!"
echo "Now run 'git push' to upload to GitHub!"
echo ""
echo "Check total commits:"
echo "git log --oneline | wc -l"
echo ""
echo "Check recent commits:"
echo "git log --oneline -10"
nano grass_planter.sh
# 위 스크립트 내용 복사해서 붙여넣기
chmod +x grass_planter.sh
cd your-username # 본인의 GitHub 프로필 레포지토리
./grass_planter.sh
git push
# 70% 확률 (기본값)
if [ $((RANDOM % 10)) -lt 7 ]; then
# 50% 확률로 변경
if [ $((RANDOM % 10)) -lt 5 ]; then
# 30% 확률로 변경
if [ $((RANDOM % 10)) -lt 3 ]; then
# 1-5개 커밋 (기본값)
commits=$((RANDOM % 5 + 1))
# 1-3개 커밋으로 변경
commits=$((RANDOM % 3 + 1))
# 고정 1개 커밋
commits=1
# 총 커밋 수 확인
git log --oneline | wc -l
# 최근 커밋 10개 확인
git log --oneline -10
# 특정 기간 커밋 확인
git log --since="2024-01-01" --until="2024-12-31" --oneline
더 자연스러운 커밋 메시지를 원한다면:
# 랜덤 메시지 배열
messages=("update docs" "fix bug" "add feature" "refactor code" "update readme")
msg=${messages[$((RANDOM % ${#messages[@]}))]}
git commit --allow-empty -m "$msg"
해보면서 느낀 것: 사실 이렇게 꼼수를 써서 하는 것 보단 직접 매일 1일 1커밋 첼린지 하는게 더 배우는 점이 많은 것 같아요