When invoking Git commands though sudo against a bare repository with reflogs enabled we should attempt to record the actual user's information in the reflog, not the identity of the user sudo entered. For example when executing: sudo -u gitadm git --git-dir=/srv/git.git branch -f pu master We want record information about the caller of sudo, not gitadm. Relying on $SUDO_UID in this case isn't as bad as it might seem. Under sudo $HOME is left as the real user's home directory and $HOME/.gitconfig is used to supply user.name and user.email. However if the real user does not have ~/.gitconfig or did not set user.name/email we need to guess it from their GECOS information. NO SBO - FOR DISCUSSION ONLY --- ident.c | 21 ++++++++++++++++++--- 1 files changed, 18 insertions(+), 3 deletions(-) diff --git a/ident.c b/ident.c index b35504a..c821d5f 100644 --- a/ident.c +++ b/ident.c @@ -7,6 +7,21 @@ */ #include "cache.h" +static uid_t caller_uid(void) +{ + const char *sudo_uid = getenv("SUDO_UID"); + char *end; + unsigned long who; + + if (!sudo_uid || !*sudo_uid) + return getuid(); + + who = strtoul(sudo_uid, &end, 10) + if (*end) + return getuid(); + return (uid_t)who; +} + static char git_default_date[50]; static void copy_gecos(const struct passwd *w, char *name, size_t sz) @@ -76,7 +91,7 @@ static void setup_ident(void) /* Get the name ("gecos") */ if (!git_default_name[0]) { - pw = getpwuid(getuid()); + pw = getpwuid(caller_uid()); if (!pw) die("You don't exist. Go away!"); copy_gecos(pw, git_default_name, sizeof(git_default_name)); @@ -90,7 +105,7 @@ static void setup_ident(void) sizeof(git_default_email)); else { if (!pw) - pw = getpwuid(getuid()); + pw = getpwuid(caller_uid()); if (!pw) die("You don't exist. Go away!"); copy_email(pw); @@ -208,7 +223,7 @@ const char *fmt_ident(const char *name, const char *email, } if (error_on_no_name) die("empty ident %s <%s> not allowed", name, email); - pw = getpwuid(getuid()); + pw = getpwuid(caller_uid()); if (!pw) die("You don't exist. Go away!"); strlcpy(git_default_name, pw->pw_name, -- Shawn. -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html