* Fixing Commit And Author
@ 2005-11-04 16:38 Darrin Thompson
2005-11-04 17:30 ` Linus Torvalds
0 siblings, 1 reply; 3+ messages in thread
From: Darrin Thompson @ 2005-11-04 16:38 UTC (permalink / raw)
To: git
I've got a small project in git where I made a dumb error. All my
commits have author/committer information like this:
Author: Darrin Thompson <darrint@dhcp-1-211.(none)> 2005-10-20 16:50:38
Committer: Darrin Thompson <darrint@dhcp-1-211.(none)> 2005-10-20
16:50:38
Tags: svn-5099
I'd like to replace the commits (yes, I know that means all of them)
with new ones with corrected email addresses and also manage to migrate
my tags. A push in the right direction would be appreciated.
Next I'd like to do the same with the kernel sources... :-)
--
Darrin
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: Fixing Commit And Author
2005-11-04 16:38 Fixing Commit And Author Darrin Thompson
@ 2005-11-04 17:30 ` Linus Torvalds
2005-11-04 21:35 ` Darrin Thompson
0 siblings, 1 reply; 3+ messages in thread
From: Linus Torvalds @ 2005-11-04 17:30 UTC (permalink / raw)
To: Darrin Thompson; +Cc: git
On Fri, 4 Nov 2005, Darrin Thompson wrote:
> I've got a small project in git where I made a dumb error. All my
> commits have author/committer information like this:
>
> Author: Darrin Thompson <darrint@dhcp-1-211.(none)> 2005-10-20 16:50:38
> Committer: Darrin Thompson <darrint@dhcp-1-211.(none)> 2005-10-20
> 16:50:38
> Tags: svn-5099
>
> I'd like to replace the commits (yes, I know that means all of them)
> with new ones with corrected email addresses and also manage to migrate
> my tags. A push in the right direction would be appreciated.
There's a program in the git sources called "git-convert-objects.c".
It basically knows how to walk the git object chains, and rewrite each
object according to a few rules.
The rules currently do _not_ include changing the author/committer info,
but it does know how to parse the really old-style dates, for example,
which are on those same lines, so adding some code there to also re-write
the author/committer name and email wouldn't be impossible.
The code isn't necessarily all that easy to understand, and usage-wise you
also have to convert each head separately (you tell it which branch head
you want to convert, it trawls every reachable object from that head, and
will create the new objects and return the new head value).
What I'm trying to say is that it might not be _pleasant_, but it's
certainly something you can automate and do in a timely manner (ie a small
project will take just a few seconds - or minutes - to convert).
> Next I'd like to do the same with the kernel sources... :-)
The same program will work, but it will take some time.
Actually, as long as you only rewrite commits, it should even be
reasonably efficient. It's when you start rewriting every single object
(like I did when I switched the compression scheme around) that it gets
_really_ expensive, and a project like the kernel would take a long long
time.
Hint to the wise: don't do the conversion on the only copy of the
repository you have. It's always worked for me, but hey, maybe I'm just
lucky and never write buggy conversion software.
Linus
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: Fixing Commit And Author
2005-11-04 17:30 ` Linus Torvalds
@ 2005-11-04 21:35 ` Darrin Thompson
0 siblings, 0 replies; 3+ messages in thread
From: Darrin Thompson @ 2005-11-04 21:35 UTC (permalink / raw)
To: Linus Torvalds; +Cc: git
On Fri, 2005-11-04 at 09:30 -0800, Linus Torvalds wrote:
> The rules currently do _not_ include changing the author/committer info,
> but it does know how to parse the really old-style dates, for example,
> which are on those same lines, so adding some code there to also re-write
> the author/committer name and email wouldn't be impossible.
>
> The code isn't necessarily all that easy to understand,
I can follow it mostly. If the commits were being read and built from
scratch with strbuf's I'd be willing to give it a try. :-)
I was able to hack together a really stupid python script that worked
fine (I think) for my less demanding case.
import sys
import os
name = "Darrin Thompson"
mail = "email@address"
os.environ['GIT_AUTHOR_NAME'] = name
os.environ['GIT_AUTHOR_EMAIL'] = mail
os.environ['GIT_COMMITTER_NAME'] = name
os.environ['GIT_COMMITTER_EMAIL'] = mail
commits = os.popen('git-rev-list HEAD | tac')
def parse_commit(commit):
tree = '///'
parents = []
lines = os.popen('git-cat-file commit %s' % commit)
for line in lines:
if not line.strip():
break
key, value = line.strip().split(None, 1)
if key == 'tree':
tree = value
elif key == 'parent':
parents.append(value)
elif key == 'author' or key == 'committer':
parts = value.split()
seconds, tz = parts[-2:]
date = ' '.join([seconds, tz])
message = ''.join(lines)
return tree, parents, message, date
tag_map = {}
tags = os.popen('git-rev-parse --symbolic --all | grep ^refs/tags/')
for line in tags:
filename = line.strip()
tag_name = filename.split('/')[-1]
tag_commit = os.popen('git-rev-parse %s' % tag_name).read().strip()
tag_list = tag_map.setdefault(tag_commit, [])
tag_list.append(tag_name)
commit_map = {}
for line in commits:
commit = line.strip()
tree, bio_parents, message, date = parse_commit(commit)
real_parents = [ commit_map[p] for p in bio_parents ]
parents_args = ' '.join([ '-p %s' % p for p in real_parents ])
os.environ['GIT_COMMITTER_DATE'] = date
os.environ['GIT_AUTHOR_DATE'] = date
write_handle, read_handle \
= os.popen2('git-commit-tree %s %s' % (tree, parents_args), 'w')
write_handle.write(message)
write_handle.close()
new_commit = read_handle.read().strip()
commit_map[commit] = new_commit
for tag_name in tag_map.get(commit, []):
os.system('git-tag -f %s %s' % (tag_name, new_commit))
read_handle.close()
print new_commit
--
Darrin
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2005-11-04 21:35 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-11-04 16:38 Fixing Commit And Author Darrin Thompson
2005-11-04 17:30 ` Linus Torvalds
2005-11-04 21:35 ` Darrin Thompson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox