In my current assignment, I'm acting as the main build guy for a number of projects that use git for source control. As such, I find it very useful to keep all my git clones up to date whether I'm actively developing in them or not. Additionally, I need to review the changes other developers are committing, so I'd like to get a summary of recent git activities.
Over time, I've put this little bash script together to help me with that. I've included the script in this posting so I can remember later what/why I did this. Disclaimer, I wrote this script and run this script in bash on Linux (not via git-bash in Windows). Also, I'm using Zenity for some nice UI look/feel.
1 #!/bin/bash
2
3 pushd ~/dev/repos > /dev/null
4
5 # The log file
6 PULL_LOG="$(mktemp)"
7
8 # Get a list of all the clones in this directory.
9 CLONES=$(find -maxdepth 2 -mindepth 2 -type d -name ".git" | sed -e 's|\./||' -e 's|/\.git||')
10
11 # Get a list of all the branches in clone/branch format
12 ALL_BRANCHES=$(for clone in $CLONES; do cd $clone; for branch in $(git branch -l | sed 's/\s\|\*//g'); do echo $clone/$branch; done; cd ..; done)
13
14 # Count the branches
15 BRANCH_COUNT=$(echo $ALL_BRANCHES | sed 's/ /\n/g' | wc -l)
16
17 # Start the log file
18 echo "Pull log for $(date)" >> $PULL_LOG
19 echo "--------------------------------------------------------------------------------" >> $PULL_LOG
20
21 # Function for pipping output to zenity progress dialog
22 function pull_clones() {
23 clone_counter=0
24 for clone in $CLONES; do
25 echo "Pulling branches for clone $clone" >> $PULL_LOG
26 echo "--------------------------------------------------------------------------------" >> $PULL_LOG
27 cd $clone
28 echo "# Fetching changes for clone $clone"
29 git fetch origin 2>> $PULL_LOG
30 for branch in $(git branch -l | sed 's/\s\|\*//g'); do
31 echo "# Merging branch $clone/$branch"
32 echo "Merging branch $branch" >> $PULL_LOG
33 git checkout $branch 2> /dev/null
34 git merge origin/$branch >> $PULL_LOG
35 echo | awk '{print count / total * 100}' count=$clone_counter total=$BRANCH_COUNT
36 let clone_counter=clone_counter+1
37 done
38 cd ..
39 echo >> $PULL_LOG
40 done
41 }
42
43 # Do it
44 pull_clones | zenity --progress --title='Pulling development clones' --width=512
45 zenity --text-info --filename=$PULL_LOG --title="Pull log" --width=500 --height=450
46
47 #Clean up
48 rm $PULL_LOG
49
50 popd > /dev/null