Git-blame-someone-else – Blame someone else for your bad code
github.com
github.com
I wrote a tutorial on a more effective (at least for me) solution to find the true author of a change: http://blog.andrewray.me/a-better-git-blame/
Unfortunately, adding -M and -C will quite badly increases the time to compute the blame. Both take an adjustable parameter (min number of characters to match), but I found I actually had to reduce it to catch all the lines in an example of the A.cpp -> A-star.cpp move I did yesterday.
tig (a curses-based git interface) fits the bill, though it can be quite confusing (too many keybindings). "tig blame -w <file>" to view a blame (-w to ignore whitespace), and then you can press , on a line to recompute the blame using the parent of that commit, while moving to the ancestor of that line (but tracking the line frequently doesn't work). And < to go back to the previous commit.
I remember that tortoisesvn was fairly nice for viewing blames, IIRC you can move through history inside it with some clicking around, and the tortoisegit interface appears to be largely the same: https://tortoisegit.org/docs/tortoisegit/tgit-dug-blame.html Windows only however.
Blame follows renames in most cases (unless you're doing something like creating a new file with the same name as the renamed one in the same commit), and you can use the -w flag to ignore whitespace changes.
Perhaps GitHub should only do this for signed commits or commits to the author's own repository or something.
GitHub also allows you to add anyone to a project without their consent (or has this changed?). This reminds me of the Facebook prank where someone added Mark Zuckerberg to a fake(?) pro-paedophile group.
It should be trivial for them to allow you to paste your pgp public key as you would your ssh public key, then place a nice little "verified" check mark next to commits that can be validated as having been signed with one of your associated private keys.
on a slow connection, this allows you to work on or inspect repos that are too large to git clone (one of the few major complaints i have with git itself)
I really wonder what they do. I have some complicated feelings about them, also, that has to do with them becoming the central hub for open source.
Like, if the product itself were open source, it might be more obvious what they are working on. But I can't demand that kind of transparency... It would just be interesting to know.
With almost 500 employees, what happens? I've never even worked at such a large company myself.
Should GitHub users have some say in what the company builds? I mean, we're promoting them like hell, and the social network is a huge part of their value.
I often wonder what well-funded large product companies do with all their manpower. Feature development doesn't seem to scale. Nor innovative design. GitHub's mobile layout is pretty crippled. I dunno. Just curious.
Of course, this has always been possible with git.
I reported this issue a long time ago to their security team, and got a really condescending "we're a collaborative community, it's not a problem, you obviously don't understand" type of response. Pretty frustrating.
Or consider the common case where the public repository on Github is just a mirror of an official repository somewhere else -- then commits from a bunch of people would all be pushed by whoever is responsible for keeping the repos in sync.
But maybe Github could just add some kind of a "pushed by" label that identifies the Github user who pushed the commit?
Even worse: rebasing (what rewriting an old commit actually does) changes all SHA hashes of the following commits, thus breaking existing PGP signatures on the commits. There should be two signatures... one for the patch+comment, one for the history.
It shows up as "Bob committed with Alice".
I've only noticed it showing up for cherry-picks, I'm unsure if that's the only place it's used.
All one has to do to make it go away is change the committer field on the git, this isn't security added by GitHub.
It already has the keys set up and such.
Oops. Thanks for the correction.
Not rewriting history, I still have this little script called fakecommit[0] lying around I have used in the past to commit stuff under other people's names.
[0]: https://github.com/winks/dotfiles/blob/cfd9d994d0bcd7510203a...
If that's really a genuine concern, then a) you are working with a big bag of dicks and b) there are _way_ worse things that person can do with write access to the repository than masquerade as somebody else.
[1] https://news.ycombinator.com/item?id=11049993
Apparently it will be obvious to folks that this has occurred.
Being a dvcs, you create atleast one commit on your local repo before pushing to a remote. That one (or more) commit can be changed to point at anyone and pushed.
The only exception to this is if someone else has not pulled into their private repo any changes at or before the commit you changed.
I like this! Thank you
I'm tempted to make the observation that there's nothing here you can't already do with a git rebase -i and:
GIT_COMMITTER_NAME=a GIT_COMMITTER_EMAIL=a@a.com GIT_COMMITTER_DATE=2006-01-02T15:04:05Z git commit --author='a <a@a.com>' --date 2006-01-02T15:04:05Z
But I realize this ability will be novel/surprising to some people, and this is meant to be a joke.I don't do this not because I can't, but because I have no incentive to lie about who wrote/committed certain code.
Actually, you only need one brute-force (of the commit that you're changing); subsequent commits only refer to the parent hash, and here we're not changing the commit trees either.
SHA1 is already considered broken, so git really should switch to SHA256 soon. This whole "sha1 commit hashes are not for security" argument is mostly naive and bogus.
The only way it would be safe, is if (a) everyone set their GPG to default to SHA256 or above (older versions still default to SHA1) and (b) either (b.1) everyone signed every commit this way, or (b.2) everyone signed their tags this way and just before tagging, reviewed their local commits including commits not authored by them up to the previously trusted tag.
But if git defaulted to SHA256 or SHA512, then we wouldn't have to reason through the complex scenarios involving (b). Making something "too secure" is a good thing if it simplifies your security analysis and allows you to use your head for other productive things.
To get a brief sense of how hard it is to do, one can look at a sample project like gitbrute [0] that tries to brute force the first n letters of a commit hash. It took someone 30 mins to brute first 8 hex letters (of 40) on a MBP [1] with that.
[0] https://github.com/bradfitz/gitbrute
[1] https://github.com/bradfitz/deadbeef/commit/deadbeefa1a98280...
and in the only case this would work, i.e. nobody has that commit yet, you could just have commited as that person. nothing new or interesting.
now, github being garbage and not accounting for PGP signatures, now this is something else.