When you work in an organization with a large number of repoositories created over time there is sometimes a need to figure who created what. You want to know who was the author of each repo.
The following three scripts can help with this.
The first get-first-commit-log.sh
will show you who was the first committer to a repo. You run it in the directory of a repo.
#!/bin/bash
# @see http://stackoverflow.com/a/5189296
# If the repo has no commits you'll get the following
# fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.
# Use '--' to separate paths from revisions, like this:
# 'git <command> [<revision>...] -- [<file>...]'
#
# Using 2> /dev/null to ignore these
git log $(git rev-list --max-parents=0 HEAD 2> /dev/null) 2> /dev/null
This is perfect for a single repo. But, what about when you've cloned each of your organization's repos into a directory. Here, as I write this there are 194 directories in my work directory. To find out the authors of each I could use another script. The following will help. It is called get-all-local-authors.sh
.
#!/bin/bash
(for f in `find . -maxdepth 1 -type d`;
do
pushd > /dev/null $f
# only do something if there is a .git directory
# do something only if there is a .git directory
if [[ -d ".git" ]]
then
get-first-commit-log.sh | grep -m 1 Author: | cut -f2- -d' ' | awk -F'[<>]' '{print $2}'
fi
popd > /dev/null
done) | sort --ignore-case | uniq
But this script produces all the unique repo authors for the organization. This would answer the question, who here has created a repo. How about who and which repo did they create.
For this, we can have a script called get-all-local-repos-authors.sh
.
#!/bin/bash
echo ""
printf "| %-55s | %-40s | \n" "-------------------------------------------------------" "----------------------------------------";
printf "| %-55s | %-40s | \n" "Repo" "Author";
printf "| %-55s | %-40s | \n" "-------------------------------------------------------" "----------------------------------------";
for d in `find . -name .git -type d`; do
pushd $d/.. > /dev/null;
# do something only if there is a .git directory
if [[ -d ".git" ]]
then
AUTHOR_EMAIL=`(get-repo-first-author.sh)`
REPO_NAME=`basename ${PWD}`;
printf "| %-55s | %-40s | \n" $REPO_NAME $AUTHOR_EMAIL;
fi
popd > /dev/null;
done
printf "| %-55s | %-40s | \n" "-------------------------------------------------------" "----------------------------------------";