# Help requested - trying to build a tool doing whole-tree commits

5 messages from 2012-11-09 to 2012-11-11. Participants: Unknown, Andreas Schwab, Junio C Hamano, Felipe Contreras, Eric S. Raymond.
Thread: https://gitlist.dev/t/32050

## Unknown, 2012-11-09 18:20

Subject: Help requested - trying to build a tool doing whole-tree commits
Message-ID: <20121109182024.81074BC66D4@golux>
URL: https://gitlist.dev/e/20121109182024.81074BC66D4%40golux

```
(Apologies if this arrives twice. I'm on the road, with somewhat flaky email.)

Because of my work on reposurgeon, I am sometimes asked to produce git
repositories for very old projects that not only are still using CVS
but have ancient releases not in the CVS repository, preserved only
as tarballs.  I have such a request currently pending from the
robotfindskitten project.

To automate this process, I am trying to write a tool that will take a
sequence of file trees and synthetic change comments in one end and
emit a git repository composing them into a DAG out the other. The
working name for this tool is 'gitpacker'.

I've already written the unpacking operation (git repo to tree
sequence plus log). This morning I discovered that git-commit
won't do quite what I need for the packing operation.
I'm requesting help.

I need a command or command sequence that will commit an entire file
tree to a repository...

(a) Allowing me to specify committer and author metadata, and

(b) deleting paths not present in the previous commit on the current
branch, and

(c) allowing me to specify merge links from other previous commits.

git commit -a passes (a) and (b) but not (c).

Advice on how to accomplish this is requested

Advice on a better name for the tool is also requested, as I'm
not happy with the way my use of 'pack' collides with existing
git use of the same verb.
-- 
		<a href="http://www.catb.org/~esr/">Eric S. Raymond</a>

.. a government and its agents are under no general duty to 
provide public services, such as police protection, to any 
particular individual citizen...
        -- Warren v. District of Columbia, 444 A.2d 1 (D.C. App.181)

```

## Andreas Schwab, 2012-11-09 21:50

Subject: Re: Help requested - trying to build a tool doing whole-tree commits
Message-ID: <m2txsyqwdi.fsf@igel.home>
URL: https://gitlist.dev/e/m2txsyqwdi.fsf%40igel.home
In-Reply-To: <20121109182024.81074BC66D4@golux>

```
Unknown <unknown@unknown.invalid> writes:

> I need a command or command sequence that will commit an entire file
> tree to a repository...
>
> (a) Allowing me to specify committer and author metadata, and
>
> (b) deleting paths not present in the previous commit on the current
> branch, and
>
> (c) allowing me to specify merge links from other previous commits.
>
> git commit -a passes (a) and (b) but not (c).

git commit -a won't add new files, so you probably want to use git add
-A && git commit.  I'm not quite sure what you mean with "merge links",
but if you want to create merge commits the you'll need to resort to
plumbing: git add -A && git write-tree && git commit-tree && git
update-ref.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."

```

## Junio C Hamano, 2012-11-10 16:57

Subject: Re: Help requested - trying to build a tool doing whole-tree commits
Message-ID: <7vlie9pf96.fsf@alter.siamese.dyndns.org>
URL: https://gitlist.dev/e/7vlie9pf96.fsf%40alter.siamese.dyndns.org
In-Reply-To: <20121109182024.81074BC66D4@golux>

```
Unknown <unknown@unknown.invalid> writes:

> (Apologies if this arrives twice. I'm on the road, with somewhat flaky email.)
>
> Because of my work on reposurgeon, I am sometimes asked to produce git
> repositories for very old projects that not only are still using CVS
> but have ancient releases not in the CVS repository, preserved only
> as tarballs.

Perhaps not exactly what you are looking for, but don't we have
import-tar somewhere in contrib/fast-import hierarchy (sorry, not on
a machine yet, and I cannot give more details).

```

## Felipe Contreras, 2012-11-10 19:24

Subject: Re: Help requested - trying to build a tool doing whole-tree commits
Message-ID: <CAMP44s2NzPw+GYKk5s7UUo8uRWob=K9nedcB+xP85rcyM5WPrQ@mail.gmail.com>
URL: https://gitlist.dev/e/CAMP44s2NzPw%2BGYKk5s7UUo8uRWob%3DK9nedcB%2BxP85rcyM5WPrQ%40mail.gmail.com
In-Reply-To: <m2txsyqwdi.fsf@igel.home>

```
On Fri, Nov 9, 2012 at 10:50 PM, Andreas Schwab <schwab@linux-m68k.org> wrote:
> Unknown <unknown@unknown.invalid> writes:

Unknown Invalid? Please don't change the original email, makes it
harder for other people to reply.

>> I need a command or command sequence that will commit an entire file
>> tree to a repository...
>>
>> (a) Allowing me to specify committer and author metadata, and
>>
>> (b) deleting paths not present in the previous commit on the current
>> branch, and
>>
>> (c) allowing me to specify merge links from other previous commits.
>>
>> git commit -a passes (a) and (b) but not (c).
>
> git commit -a won't add new files, so you probably want to use git add
> -A && git commit.  I'm not quite sure what you mean with "merge links",
> but if you want to create merge commits the you'll need to resort to
> plumbing: git add -A && git write-tree && git commit-tree && git
> update-ref.

I've done something similar, except that I used git hash-object
instead of git commit-tree so that I can specify every single detail
about the commit object.

Cheers.

-- 
Felipe Contreras

```

## Eric S. Raymond, 2012-11-11 14:47

Subject: Re: Help requested - trying to build a tool doing whole-tree commits
Message-ID: <20121111144722.GA3593@thyrsus.com>
URL: https://gitlist.dev/e/20121111144722.GA3593%40thyrsus.com
In-Reply-To: <7vlie9pf96.fsf@alter.siamese.dyndns.org>

```
Junio C Hamano <gitster@pobox.com>:
> Perhaps not exactly what you are looking for, but don't we have
> import-tar somewhere in contrib/fast-import hierarchy (sorry, not on
> a machine yet, and I cannot give more details).

If I recall correctly, that can only be used for original import.

I think Andreas Schwab's suggestion (git add -A && git write-tree &&
git commit-tree && git update-ref) is probably the right thing. I'm
going to try that.
-- 
		<a href="http://www.catb.org/~esr/">Eric S. Raymond</a>

```
