3 # Syncs with remote hosts in the git (sub)directories.
5 # Allows fetching (no merge) and pushing at the moment.
8 # Select the method: fetch, push and status is possible.
9 if [ x$1 = x -o x$1 = xstatus -o x$1 = xst ]; then
11 elif [ $1 = fetch -o $1 = fe ]; then
13 elif [ $1 = push -o $1 = pu ]; then
16 echo "Usage: sync.sh [fetch | fe | push | pu | status | st]"
18 echo "fetch: Fetch from all remotes."
19 echo "push: Push to all remotes."
20 echo "status: Display status for all git repositories."
24 # Execute the given method for each git subdirectory.
25 for project in `find . -name .git -type d`; do
29 # Remove .git from repository name.
30 project=`echo "$project" | sed "s|.git||"`
32 # Display all commits not in the master branch (which have to be merged
33 # from the remote branches) or not in the remote branches (which have to
34 # be pushed to the remote hosts).
35 if [ $method = status ]; then
36 # Display a log similar to gitk but for the console.
38 output=`git log --graph --all --pretty=oneline --color $1`
39 if [ "x$output" != x ]; then
45 # Display unmerged commits.
46 git_log master.. "$project needs merge:"
48 # Display not pushed commits.
49 for branch in `git branch -r`; do
50 branch=`echo "$branch" | sed 's|* ||g'`
51 git_log "$branch.." "$project ($branch) needs push:"
54 # Fetch from/Push to all remotes.
56 for remote in `git remote`; do
57 echo "$project: ${method}ing $remote ..."
65 # Run status after a fetch to see new changes.
66 if [ $method = fetch ]; then