Git development
 help / color / mirror / Atom feed
* Re: Cleaning up git user-interface warts
From: Shawn Pearce @ 2006-11-15 18:49 UTC (permalink / raw)
  To: Nicolas Pitre; +Cc: Linus Torvalds, Junio C Hamano, git
In-Reply-To: <Pine.LNX.4.64.0611151315291.2591@xanadu.home>

Nicolas Pitre <nico@cam.org> wrote:
> As for the fraction of people complaining being a small fraction of 
> current GIT users: that is easily explainable by the fact that most 
> people who would have grown the complainers group are simply not GIT 
> users anymore since they were turned away by GIT's current user 
> interface issues.  The only complainers remaining are those who see 
> value in the GIT technology but who would like to bring more 
> intuitiveness to the GIT interface instead of going for the alternative 
> technology.  And those kind of people are always few.

Or they are by proxy.

*I* don't see that much of a problem with git pull; I can use it
without trouble at this point.  But I find it difficult to teach
to others.

My complaints about git pull/fetch/push are by proxy for about 10
other users who aren't on the mailing list but whom I interact with
through Git.  They don't like pull/fetch/push very much.

So count my complaints 10 times.  :)

Ok, that's still a drop in the bucket of current Git users.
But still, I'm sure there are others.  I think Carl was recently
talking about complaints from some Fedora folks...

-- 

^ permalink raw reply

* Re: Cleaning up git user-interface warts
From: Nicolas Pitre @ 2006-11-15 18:43 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Junio C Hamano, git
In-Reply-To: <Pine.LNX.4.64.0611150950170.3349@woody.osdl.org>

On Wed, 15 Nov 2006, Linus Torvalds wrote:

> 
> 
> On Tue, 14 Nov 2006, Nicolas Pitre wrote:
> > 
> > But the fact is that HG (which has a growing crowd of happy campers, 
> > maybe even larger than the BK crowd now) did work with and got used to a 
> > sensible definition of what a "pull" is.
> 
> Guys, before you start thinking this way, the fact is, there's a lot of 
> happy git users. 
> 
> So the reason for using "git pull" is
> 
>  - bk did it that way, and like it or not, bk was the first usable 
>    distributed system. hg is totally uninteresting.
> 
>  - git itself has now done it that way for the last 18 months, and the 
>    fact is, the people _complaining_ are a small subset of the people who 
>    actually use git on a daily basis and don't complain.

Those arguments are somewhat flawed.  If we stick to "BK did it that way 
and it was first", then following that logic we would also carry a lot 
of CVS baggage because "CVS did it that way, and it was the most 
successful of its kind".  Still, we decided not to follow CVS nor BK in 
many ways already.

As for the fraction of people complaining being a small fraction of 
current GIT users: that is easily explainable by the fact that most 
people who would have grown the complainers group are simply not GIT 
users anymore since they were turned away by GIT's current user 
interface issues.  The only complainers remaining are those who see 
value in the GIT technology but who would like to bring more 
intuitiveness to the GIT interface instead of going for the alternative 
technology.  And those kind of people are always few.

> So don't fall for the classic "second system syndrome". The classic reason 
> for getting the second system wrong is because you focus on the issues 
> people complain about, and not on the issues that work well (because the 
> issues that work fine are obviously not getting a lot of attention).

The counter part of that is the possibility to fall for the "ivory tower 
syndrome" where seasoned GIT users feel they are well satisfied with 
what is currently available and unwilling to consider changes that would 
reduce the barrier to entry for new users... simply because they are so 
used to the way things work that they can't see why others have problems 
with it.

> If you think "pull" is confusing, I can guarantee you that _changing_ the 
> name is a hell of a lot more confusing.

Agreed.  This is why the current discussion led to a proposition that 
allows for "pull" to remain as is but to have a "get" version that would 
be the alternate (saner) version.

> In fact, I think a lot of the 
> confusion comes from cogito, not from git - the fact that cogito used 
> different names and different syntax was a mistake, I think.
> 
> And that '#' for branch naming in particular was (and is) total 
> braindamage. The native git branch naming convention is just fundamentally 
> much better, and allows you to very naturally fetch multiple branches at 
> once, in a way that cogito's syntax does not.
> 
> So when I see suggestions of using that brain-damaged cogito syntax as an 
> "improvement", I know for a fact that somebody hasn't thought things 
> through, and only thinks it's a better syntax beause of totally bogus 
> reasons.

Do you have comments on my proposed syntax (that would be implemented 
with a git-get command) which I think doesn't really look like cogito?

> I do agree that we probably could/should re-use the "git merge" name. The 
> current "git merge" is an esoteric internal routine, and I doubt a lot of 
> people use it as-is. I don't think it would be a mistake to make "git 
> merge" basically be an alias for "git pull", for example, and I doubt many 
> people would really even notice.

Agreed.

> But the fact is, git isn't really that hard to work out, and the commands 
> aren't that complicated.

I agree with you in general, except for the "pull" behavior which is 
really really odd.  Maybe it made sense in the BK context, maybe it is 
fine _once_ you get used to it, but otherwise it is really overloaded.

> But trying to rename "pull" (or the "git" name itself) is just going to 
> cause more confusion than you fix.

Agreed again.



^ permalink raw reply

* RE: [GIT PATCH] Makefile missing git-runstatus in PROGRAMS list
From: Bhavesh Davda @ 2006-11-15 18:42 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

> 
> > Attached is my attempt at the same command "make 
> prefix=/var/tmp/ggg clean
> > all install"
> >
> > make install failes for the templates directory, leading to 
> the entire make
> > install failing:
> >
> > make -C templates DESTDIR='' install
> > make[1]: Entering directory `/VMware/kernel/git/git/templates'
> > : no custom templates yet
> > install -d -m755 '/var/tmp/ggg/share/git-core/templates/'
> > (cd blt && tar cf - .) | \
> > (cd '/var/tmp/ggg/share/git-core/templates/' && tar xf -)
> > tar: This does not look like a tar archive
> > tar: Skipping to next header
> > tar: Archive contains obsolescent base-64 headers
> > tar: Error exit delayed from previous errors
> 
> I have a feeling that you have CDPATH exported to the
> environment, which is a braindamage.  It is a fine usability
> helper for interactive shells so I do not have problem with
> people setting that in shell as shell variables, though.
> 
> In other words, never do "export CDPATH=..." nor "export CDPATH".
> 
> 

Indeed! I had "export CDPATH=.:$HOME" in my $HOME/.bash_profile.

"export -n CDPATH", and now "make install" works, setting up those hard links
too.

If this is a common gotcha in building and installing git, maybe you should
add it near the top of the INSTALL instructions.

I haven't run into this issue with other projects. Is there something that
can be changed in git's Makefile so it works even if CDPATH is set and
exported in people's environments? What about simply not naming the subdir
blt for both source and install directories under templates?

Thanks!


^ permalink raw reply

* Re: [PATCH] Seek back to current filepos when mmap()ing with NO_MMAP
From: Johannes Schindelin @ 2006-11-15 18:32 UTC (permalink / raw)
  To: Morten Welinder; +Cc: git
In-Reply-To: <118833cc0611151026q25fb6eeeid3a74e20498f00d@mail.gmail.com>

Hi,

On Wed, 15 Nov 2006, Morten Welinder wrote:

> Using xmalloc in there seems wrong.  A plain malloc would do and the
> error would be returned back to the mmap caller.

I did not touch that code at all in this patch.

Ciao,
Dscho

^ permalink raw reply

* Re: [GIT PATCH] Makefile missing git-runstatus in PROGRAMS list
From: Junio C Hamano @ 2006-11-15 18:29 UTC (permalink / raw)
  To: Bhavesh Davda; +Cc: git
In-Reply-To: <FE74AC4E0A23124DA52B99F17F44159701A11D6C@PA-EXCH03.vmware.com>

"Bhavesh Davda" <bhavesh@vmware.com> writes:

> Attached is my attempt at the same command "make prefix=/var/tmp/ggg clean
> all install"
>
> make install failes for the templates directory, leading to the entire make
> install failing:
>
> make -C templates DESTDIR='' install
> make[1]: Entering directory `/VMware/kernel/git/git/templates'
> : no custom templates yet
> install -d -m755 '/var/tmp/ggg/share/git-core/templates/'
> (cd blt && tar cf - .) | \
> (cd '/var/tmp/ggg/share/git-core/templates/' && tar xf -)
> tar: This does not look like a tar archive
> tar: Skipping to next header
> tar: Archive contains obsolescent base-64 headers
> tar: Error exit delayed from previous errors

I have a feeling that you have CDPATH exported to the
environment, which is a braindamage.  It is a fine usability
helper for interactive shells so I do not have problem with
people setting that in shell as shell variables, though.

In other words, never do "export CDPATH=..." nor "export CDPATH".

^ permalink raw reply

* Re: Cleaning up git user-interface warts
From: Jakub Narebski @ 2006-11-15 18:28 UTC (permalink / raw)
  To: git
In-Reply-To: <Pine.LNX.4.64.0611150950170.3349@woody.osdl.org>

Linus Torvalds wrote:

> But the fact is, git isn't really that hard to work out, and the commands 
> aren't that complicated. There's no reason to rename them. We do have 
> other problems:
> 
>  - default branch selection for merging is broken (it should definitely 
>    take the current branch into account). When I do "git pull" with no 
>    branch specification, and I happen to be on a branch that is associated 
>    with something else than "master" in the remote, I shouldn't merge with 
>    master.

This problem is _slightly_ migitated by branch.<name>.merge config variable.
Slightly because you have to specify branch to merge, instead of forbidding
merge if you are not on specific branch (and you don't override it).

>  - I agree that having to create temporary branches to just look at a tag 
>    that you don't want to actually develop on is just unnecessarily 
>    bothersome.

Agreed.

-- 
Jakub Narebski
Warsaw, Poland
ShadeHawk on #git


^ permalink raw reply

* Re: [PATCH] Seek back to current filepos when mmap()ing with NO_MMAP
From: Morten Welinder @ 2006-11-15 18:26 UTC (permalink / raw)
  To: Johannes Schindelin; +Cc: junkio, git
In-Reply-To: <Pine.LNX.4.63.0611151727000.13772@wbgn013.biozentrum.uni-wuerzburg.de>

Using xmalloc in there seems wrong.  A plain malloc would do and the
error would be returned back to the mmap caller.


^ permalink raw reply

* Re: git tag: don't complain of empty messages
From: Junio C Hamano @ 2006-11-15 18:23 UTC (permalink / raw)
  To: hanwen; +Cc: git
In-Reply-To: <ejfc1t$6am$1@sea.gmane.org>

Han-Wen Nienhuys <hanwen@xs4all.nl> writes:

> Hello,
>
> GIT refuses to set annotated tags without a comment. I think this is a
> silly restriction when the message is explicitly set to the empty
> string.
>
> The attached patch should fix this;  Unfortunately, I've been unable
> to test it. Running the script with sh -x stops at
>
> ++exec /home/hanwen/usr/pkg/git/bin/git-sh-setup
>
> -- 
>  Han-Wen Nienhuys - hanwen@xs4all.nl - http://www.xs4all.nl/~hanwen
> commit 446cfbd9edcfaf5fe76f597823e0e3314d091489
> Author: Han-Wen Nienhuys <hanwen@lilypond.org>
> Date:   Wed Nov 15 16:27:27 2006 +0100
>
>     always set tag if -m is given, even if empty
>

Please follow Documentation/SubmittingPatches.

> diff --git a/git-tag.sh b/git-tag.sh
> index ac269e3..f2533a3 100755
> --- a/git-tag.sh
> +++ b/git-tag.sh
> @@ -5,6 +5,7 @@ USAGE='-l [<pattern>] | [-a | -s | -u <k
>  SUBDIRECTORY_OK='Yes'
>  . git-sh-setup
>  
> +message_given=
>  annotate=
>  signed=
>  force=
> @@ -37,6 +38,7 @@ do
>      	annotate=1
>  	shift
>  	message="$1"
> +	message_given=1
>  	;;
>      -u)
>  	annotate=1

If you are going to do this, this hunk should be changed to
check if the command line ended with "-m" without next
parameter, in which case it should error out.

I do not have a strong objection against allowing tags without
messages, but at the same time I do not see a compelling reason
to allow them either.  Care to explain what workflow is helped
by an empty tag?

^ permalink raw reply

* Re: Cleaning up git user-interface warts
From: Junio C Hamano @ 2006-11-15 18:16 UTC (permalink / raw)
  To: Nicolas Pitre; +Cc: git
In-Reply-To: <Pine.LNX.4.64.0611151000460.2591@xanadu.home>

Nicolas Pitre <nico@cam.org> writes:

>> Why not do something like "get/put" instead? It is
>> 
>> - easier to remember
>> - not bogus (AFAICT the meaning is not used in diametrical senses)
>> - shorter to type than download/upload
>
> Well, of all compromizes this is probably the best one so far.  I would 
> have prefered to bite the bullet and fix "pull" instead of adding yet 
> more commands.  But if the consensus is that there is no way on earth 
> that "pull" can be salvaged then get/put is probably more enjoyable than 
> download/upload.  This way pull/fetch/push could still be available 
> (albeit burried somewhere out of sight).

I still think in the long run you would be better off giving
separate names to Porcelains because I am sure you are going to
find the next command to "fix", you cannot suddenly change the
semantics of the command, and you soon run out of alternative
ways to name the action and you in addition have to explain the
differences between fetch and get to new users.  At least, with
"ig pull", you can dismiss all the broken git-x Porcelain-ish by
saying "Oh, git-x user-level commands had inconsistent semantics
and broken UI so do not use them anymore -- they are still there
only to help old timers transition.  The user level commands are
now called ig-x and ig stands for improved git".

But that's a very minor detail and can be fixed when we hit the
wall, so let's wait and see what happens.  Please consider my
gh/gu/cg/whatever dropped.

I think get/put is much better than suddenly changing what pull
means and is shorter to type than x-load; I am Ok with them.
Although I think these words are tainted by SCCS, I do not think
anybody cares.

^ permalink raw reply

* Re: Cleaning up git user-interface warts
From: Nicolas Pitre @ 2006-11-15 18:11 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git
In-Reply-To: <7vfyckoaju.fsf@assigned-by-dhcp.cox.net>

On Wed, 15 Nov 2006, Junio C Hamano wrote:

> Nicolas Pitre <nico@cam.org> writes:
> 
> > But again I think it is important that the URL to use must be a per 
> > branch attribute i.e. attached to "default/master" and not just 
> > "default".  This way someone could add all branches of interest into the 
> > "default" group even if they're from different repositories, and a 
> > simple  get without any argument would get them all.
> 
> I think the "one group per one remote repository" model is a lot
> easier to explain.  At least when I read your first "branch
> group" proposal that was I thought was going on and I found it
> quite sensible (and it maps more or less straightforwardly to
> the way existing .git/refs/remotes is set up by default).

I think one group per remote repo is how things should be by default 
too.  But we should not limit it to that if possible.



^ permalink raw reply

* RE: [GIT PATCH] Makefile missing git-runstatus in PROGRAMS list
From: Bhavesh Davda @ 2006-11-15 18:08 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

[-- Attachment #1: Type: text/plain, Size: 1519 bytes --]

> Interesting.  You do not seem to have not just git-runstatus but
> anything built-in.  The last action in "make install" should
> look like this log entry (I just did "make prefix=/var/tmp/ggg
> clean all install"):
> 
> rm -f '/var/tmp/ggg/bin/git-format-patch' && ln 
> '/var/tmp/ggg/bin/git' '/var/tmp/ggg/bin/git-format-patch' ;  
> rm -f '/var/tmp/ggg/bin/git-show' && ln 
> '/var/tmp/ggg/bin/git' '/var/tmp/ggg/bin/git-show' ; ... rm 
> -f '/var/tmp/ggg/bin/git-verify-pack' && ln 
> '/var/tmp/ggg/bin/git' '/var/tmp/ggg/bin/git-verify-pack' ;  
> rm -f '/var/tmp/ggg/bin/git-write-tree' && ln 
> '/var/tmp/ggg/bin/git' '/var/tmp/ggg/bin/git-write-tree' ;
> 
> that installs 47 hardlinks to $(prefix)/bin/git.


Attached is my attempt at the same command "make prefix=/var/tmp/ggg clean
all install"

make install failes for the templates directory, leading to the entire make
install failing:

make -C templates DESTDIR='' install
make[1]: Entering directory `/VMware/kernel/git/git/templates'
: no custom templates yet
install -d -m755 '/var/tmp/ggg/share/git-core/templates/'
(cd blt && tar cf - .) | \
(cd '/var/tmp/ggg/share/git-core/templates/' && tar xf -)
tar: This does not look like a tar archive
tar: Skipping to next header
tar: Archive contains obsolescent base-64 headers
tar: Error exit delayed from previous errors
make[1]: *** [install] Error 2
make[1]: Leaving directory `/VMware/kernel/git/git/templates'
make: *** [install] Error 2

Thanks

- Bhavesh

[-- Attachment #2: ggg-bpd.log --]
[-- Type: application/octet-stream, Size: 44849 bytes --]

GIT_VERSION = 1.4.4-rc2.GIT
rm -f *.o mozilla-sha1/*.o arm/*.o ppc/*.o compat/*.o xdiff/*.o \
	libgit.a xdiff/lib.a
rm -f git-convert-objects git-fetch-pack git-fsck-objects git-hash-object git-index-pack git-local-fetch git-merge-base git-daemon git-merge-index git-mktag git-mktree git-patch-id git-peek-remote git-receive-pack git-send-pack git-shell git-show-index git-ssh-fetch git-ssh-upload git-unpack-file git-update-server-info git-upload-pack git-verify-pack git-pack-redundant git-var git-describe git-merge-tree git-imap-send git-merge-recursive  git-ssh-pull git-ssh-push git-http-fetch git-http-push git-bisect git-checkout git-clean git-clone git-commit git-fetch git-ls-remote git-merge-one-file git-parse-remote git-pull git-rebase git-repack git-request-pull git-reset git-resolve git-revert git-sh-setup git-tag git-verify-tag git-applymbox git-applypatch git-am git-merge git-merge-stupid git-merge-octopus git-merge-resolve git-merge-ours git-lost-found git-quiltimport git-archimport git-cvsimport git-relink git-shortlog git-rerere git-cvsserver git-svnimport git-cvsexportcommit git-send-email git-svn git-merge-recursive-old git-cherry-pick git-status git-instaweb git-merge-recur git-format-patch git-show git-whatchanged git-cherry git-get-tar-commit-id git-add git-annotate git-apply git-archive git-blame git-branch git-cat-file git-checkout-index git-check-ref-format git-commit-tree git-count-objects git-diff git-diff-files git-diff-index git-diff-stages git-diff-tree git-fmt-merge-msg git-for-each-ref git-grep git-init-db git-log git-ls-files git-ls-tree git-mailinfo git-mailsplit git-mv git-name-rev git-pack-objects git-prune git-prune-packed git-push git-read-tree git-repo-config git-rev-list git-rev-parse git-rm git-runstatus git-show-branch git-stripspace git-symbolic-ref git-tar-tree git-unpack-objects git-update-index git-update-ref git-upload-archive git-verify-pack git-write-tree git-show-ref git-pack-refs git
rm -f *.spec *.pyc *.pyo */*.pyc */*.pyo common-cmds.h TAGS tags
rm -rf autom4te.cache
rm -f configure config.log config.mak.autogen config.mak.append config.status config.cache
rm -rf git-1.4.4-rc2.GIT .doc-tmp-dir
rm -f git-1.4.4-rc2.GIT.tar.gz git-core_1.4.4-rc2.GIT-*.tar.gz
rm -f git-htmldocs-1.4.4-rc2.GIT.tar.gz git-manpages-1.4.4-rc2.GIT.tar.gz
rm -f gitweb/gitweb.cgi
make -C Documentation/ clean
make[1]: Entering directory `/VMware/kernel/git/git/Documentation'
rm -f doc.dep+ doc.dep
perl ./build-docdep.perl >doc.dep+
mv doc.dep+ doc.dep
make[1]: Leaving directory `/VMware/kernel/git/git/Documentation'
make[1]: Entering directory `/VMware/kernel/git/git/Documentation'
rm -f *.xml *.html *.1 *.7 howto-index.txt howto/*.html doc.dep README
make[1]: Leaving directory `/VMware/kernel/git/git/Documentation'
[ ! -f perl/Makefile ] || make -C perl/ clean || make -C perl/ clean
rm -f perl/ppport.h perl/Makefile.old
make -C templates/ clean
make[1]: Entering directory `/VMware/kernel/git/git/templates'
rm -rf blt boilerplates.made
make[1]: Leaving directory `/VMware/kernel/git/git/templates'
make -C t/ clean
make[1]: Entering directory `/VMware/kernel/git/git/t'
rm -fr trash
make[1]: Leaving directory `/VMware/kernel/git/git/t'
rm -f GIT-VERSION-FILE GIT-CFLAGS
    * new build flags or prefix
(cd perl && /usr/bin/perl Makefile.PL \
	PREFIX='/var/tmp/ggg')
/VMware/kernel/git/git/perl
Writing Makefile for Git
gcc -o convert-objects.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY convert-objects.c
gcc -o blob.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY blob.c
gcc -o commit.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY commit.c
gcc -o connect.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY connect.c
gcc -o csum-file.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY csum-file.c
gcc -o cache-tree.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY cache-tree.c
gcc -o base85.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY base85.c
gcc -o date.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY date.c
gcc -o diff-delta.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY diff-delta.c
gcc -o entry.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY entry.c
gcc -o exec_cmd.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY '-DGIT_EXEC_PATH="/var/tmp/ggg/bin"' exec_cmd.c
gcc -o ident.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY ident.c
gcc -o interpolate.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY interpolate.c
gcc -o lockfile.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY lockfile.c
gcc -o object.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY object.c
gcc -o pack-check.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY pack-check.c
gcc -o patch-delta.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY patch-delta.c
gcc -o path.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY path.c
gcc -o pkt-line.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY pkt-line.c
gcc -o sideband.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY sideband.c
gcc -o quote.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY quote.c
gcc -o read-cache.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY read-cache.c
gcc -o refs.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY refs.c
gcc -o run-command.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY run-command.c
gcc -o dir.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY dir.c
gcc -o object-refs.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY object-refs.c
gcc -o server-info.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY server-info.c
gcc -o setup.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY setup.c
gcc -o sha1_file.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY sha1_file.c
gcc -o sha1_name.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY sha1_name.c
gcc -o strbuf.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY strbuf.c
gcc -o tag.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY tag.c
gcc -o tree.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY tree.c
gcc -o usage.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY usage.c
gcc -o config.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY config.c
gcc -o environment.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY environment.c
gcc -o ctype.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY ctype.c
gcc -o copy.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY copy.c
gcc -o revision.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY revision.c
gcc -o pager.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY pager.c
gcc -o tree-walk.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY tree-walk.c
gcc -o xdiff-interface.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY xdiff-interface.c
gcc -o write_or_die.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY write_or_die.c
gcc -o trace.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY trace.c
gcc -o list-objects.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY list-objects.c
gcc -o grep.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY grep.c
gcc -o alloc.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY alloc.c
gcc -o merge-file.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY merge-file.c
gcc -o path-list.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY path-list.c
./generate-cmdlist.sh > common-cmds.h+
mv common-cmds.h+ common-cmds.h
gcc -o help.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY help.c
gcc -o unpack-trees.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY unpack-trees.c
gcc -o diff.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY diff.c
gcc -o diff-lib.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY diff-lib.c
gcc -o diffcore-break.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY diffcore-break.c
gcc -o diffcore-order.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY diffcore-order.c
gcc -o diffcore-pickaxe.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY diffcore-pickaxe.c
gcc -o diffcore-rename.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY diffcore-rename.c
gcc -o tree-diff.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY tree-diff.c
gcc -o combine-diff.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY combine-diff.c
gcc -o diffcore-delta.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY diffcore-delta.c
gcc -o log-tree.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY log-tree.c
gcc -o color.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY color.c
gcc -o wt-status.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY wt-status.c
gcc -o archive-zip.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY archive-zip.c
gcc -o archive-tar.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY archive-tar.c
gcc -o compat/strlcpy.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY compat/strlcpy.c
rm -f libgit.a && ar rcs libgit.a blob.o commit.o connect.o csum-file.o cache-tree.o base85.o date.o diff-delta.o entry.o exec_cmd.o ident.o interpolate.o lockfile.o object.o pack-check.o patch-delta.o path.o pkt-line.o sideband.o quote.o read-cache.o refs.o run-command.o dir.o object-refs.o server-info.o setup.o sha1_file.o sha1_name.o strbuf.o tag.o tree.o usage.o config.o environment.o ctype.o copy.o revision.o pager.o tree-walk.o xdiff-interface.o write_or_die.o trace.o list-objects.o grep.o alloc.o merge-file.o path-list.o help.o unpack-trees.o diff.o diff-lib.o diffcore-break.o diffcore-order.o diffcore-pickaxe.o diffcore-rename.o tree-diff.o combine-diff.o diffcore-delta.o log-tree.o color.o wt-status.o archive-zip.o archive-tar.o compat/strlcpy.o
gcc -o xdiff/xdiffi.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY xdiff/xdiffi.c
gcc -o xdiff/xprepare.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY xdiff/xprepare.c
gcc -o xdiff/xutils.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY xdiff/xutils.c
gcc -o xdiff/xemit.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY xdiff/xemit.c
rm -f xdiff/lib.a && ar rcs xdiff/lib.a xdiff/xdiffi.o xdiff/xprepare.o xdiff/xutils.o xdiff/xemit.o
gcc -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -o git-convert-objects   convert-objects.o libgit.a xdiff/lib.a -lz  -lcrypto
gcc -o fetch-pack.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY fetch-pack.c
gcc -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -o git-fetch-pack   fetch-pack.o libgit.a xdiff/lib.a -lz  -lcrypto
gcc -o fsck-objects.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY fsck-objects.c
gcc -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -o git-fsck-objects   fsck-objects.o libgit.a xdiff/lib.a -lz  -lcrypto
gcc -o hash-object.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY hash-object.c
gcc -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -o git-hash-object   hash-object.o libgit.a xdiff/lib.a -lz  -lcrypto
gcc -o index-pack.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY index-pack.c
gcc -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -o git-index-pack   index-pack.o libgit.a xdiff/lib.a -lz  -lcrypto
gcc -o local-fetch.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY local-fetch.c
gcc -o fetch.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY fetch.c
gcc -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -o git-local-fetch   local-fetch.o fetch.o libgit.a xdiff/lib.a -lz  -lcrypto
gcc -o merge-base.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY merge-base.c
gcc -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -o git-merge-base   merge-base.o libgit.a xdiff/lib.a -lz  -lcrypto
gcc -o daemon.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY daemon.c
gcc -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -o git-daemon   daemon.o libgit.a xdiff/lib.a -lz  -lcrypto
gcc -o merge-index.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY merge-index.c
gcc -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -o git-merge-index   merge-index.o libgit.a xdiff/lib.a -lz  -lcrypto
gcc -o mktag.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY mktag.c
gcc -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -o git-mktag   mktag.o libgit.a xdiff/lib.a -lz  -lcrypto
gcc -o mktree.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY mktree.c
gcc -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -o git-mktree   mktree.o libgit.a xdiff/lib.a -lz  -lcrypto
gcc -o patch-id.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY patch-id.c
gcc -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -o git-patch-id   patch-id.o libgit.a xdiff/lib.a -lz  -lcrypto
gcc -o peek-remote.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY peek-remote.c
gcc -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -o git-peek-remote   peek-remote.o libgit.a xdiff/lib.a -lz  -lcrypto
gcc -o receive-pack.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY receive-pack.c
gcc -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -o git-receive-pack   receive-pack.o libgit.a xdiff/lib.a -lz  -lcrypto
gcc -o send-pack.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY send-pack.c
gcc -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -o git-send-pack   send-pack.o libgit.a xdiff/lib.a -lz  -lcrypto
gcc -o shell.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY shell.c
gcc -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -o git-shell   shell.o libgit.a xdiff/lib.a -lz  -lcrypto
gcc -o show-index.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY show-index.c
gcc -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -o git-show-index   show-index.o libgit.a xdiff/lib.a -lz  -lcrypto
gcc -o ssh-fetch.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY ssh-fetch.c
gcc -o rsh.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY rsh.c
gcc -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -o git-ssh-fetch   ssh-fetch.o rsh.o fetch.o libgit.a xdiff/lib.a -lz  -lcrypto
gcc -o ssh-upload.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY ssh-upload.c
gcc -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -o git-ssh-upload   ssh-upload.o rsh.o libgit.a xdiff/lib.a -lz  -lcrypto
gcc -o unpack-file.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY unpack-file.c
gcc -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -o git-unpack-file   unpack-file.o libgit.a xdiff/lib.a -lz  -lcrypto
gcc -o update-server-info.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY update-server-info.c
gcc -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -o git-update-server-info   update-server-info.o libgit.a xdiff/lib.a -lz  -lcrypto
gcc -o upload-pack.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY upload-pack.c
gcc -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -o git-upload-pack   upload-pack.o libgit.a xdiff/lib.a -lz  -lcrypto
gcc -o builtin-add.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-add.c
gcc -o builtin-annotate.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-annotate.c
gcc -o builtin-apply.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-apply.c
gcc -o builtin-archive.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-archive.c
gcc -o builtin-blame.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-blame.c
gcc -o builtin-branch.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-branch.c
gcc -o builtin-cat-file.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-cat-file.c
gcc -o builtin-checkout-index.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-checkout-index.c
gcc -o builtin-check-ref-format.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-check-ref-format.c
gcc -o builtin-commit-tree.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-commit-tree.c
gcc -o builtin-count-objects.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-count-objects.c
gcc -o builtin-diff.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-diff.c
gcc -o builtin-diff-files.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-diff-files.c
gcc -o builtin-diff-index.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-diff-index.c
gcc -o builtin-diff-stages.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-diff-stages.c
gcc -o builtin-diff-tree.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-diff-tree.c
gcc -o builtin-fmt-merge-msg.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-fmt-merge-msg.c
gcc -o builtin-for-each-ref.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-for-each-ref.c
gcc -o builtin-grep.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-grep.c
gcc -o builtin-init-db.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -DDEFAULT_GIT_TEMPLATE_DIR='"/var/tmp/ggg/share/git-core/templates/"' builtin-init-db.c
gcc -o builtin-log.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-log.c
gcc -o builtin-ls-files.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-ls-files.c
gcc -o builtin-ls-tree.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-ls-tree.c
gcc -o builtin-mailinfo.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-mailinfo.c
gcc -o builtin-mailsplit.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-mailsplit.c
gcc -o builtin-mv.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-mv.c
gcc -o builtin-name-rev.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-name-rev.c
gcc -o builtin-pack-objects.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-pack-objects.c
gcc -o builtin-prune.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-prune.c
gcc -o builtin-prune-packed.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-prune-packed.c
gcc -o builtin-push.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-push.c
gcc -o builtin-read-tree.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-read-tree.c
gcc -o builtin-repo-config.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-repo-config.c
gcc -o builtin-rev-list.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-rev-list.c
gcc -o builtin-rev-parse.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-rev-parse.c
gcc -o builtin-rm.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-rm.c
gcc -o builtin-runstatus.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-runstatus.c
gcc -o builtin-show-branch.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-show-branch.c
gcc -o builtin-stripspace.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-stripspace.c
gcc -o builtin-symbolic-ref.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-symbolic-ref.c
gcc -o builtin-tar-tree.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-tar-tree.c
gcc -o builtin-unpack-objects.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-unpack-objects.c
gcc -o builtin-update-index.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-update-index.c
gcc -o builtin-update-ref.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-update-ref.c
gcc -o builtin-upload-archive.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-upload-archive.c
gcc -o builtin-verify-pack.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-verify-pack.c
gcc -o builtin-write-tree.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-write-tree.c
gcc -o builtin-show-ref.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-show-ref.c
gcc -o builtin-pack-refs.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY builtin-pack-refs.c
gcc -DGIT_VERSION='"1.4.4-rc2.GIT"' \
	-g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -o git git.c \
	builtin-add.o builtin-annotate.o builtin-apply.o builtin-archive.o builtin-blame.o builtin-branch.o builtin-cat-file.o builtin-checkout-index.o builtin-check-ref-format.o builtin-commit-tree.o builtin-count-objects.o builtin-diff.o builtin-diff-files.o builtin-diff-index.o builtin-diff-stages.o builtin-diff-tree.o builtin-fmt-merge-msg.o builtin-for-each-ref.o builtin-grep.o builtin-init-db.o builtin-log.o builtin-ls-files.o builtin-ls-tree.o builtin-mailinfo.o builtin-mailsplit.o builtin-mv.o builtin-name-rev.o builtin-pack-objects.o builtin-prune.o builtin-prune-packed.o builtin-push.o builtin-read-tree.o builtin-repo-config.o builtin-rev-list.o builtin-rev-parse.o builtin-rm.o builtin-runstatus.o builtin-show-branch.o builtin-stripspace.o builtin-symbolic-ref.o builtin-tar-tree.o builtin-unpack-objects.o builtin-update-index.o builtin-update-ref.o builtin-upload-archive.o builtin-verify-pack.o builtin-write-tree.o builtin-show-ref.o builtin-pack-refs.o   libgit.a xdiff/lib.a -lz  -lcrypto
rm -f git-verify-pack && ln git git-verify-pack
gcc -o pack-redundant.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY pack-redundant.c
gcc -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -o git-pack-redundant   pack-redundant.o libgit.a xdiff/lib.a -lz  -lcrypto
gcc -o var.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY var.c
gcc -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -o git-var   var.o libgit.a xdiff/lib.a -lz  -lcrypto
gcc -o describe.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY describe.c
gcc -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -o git-describe   describe.o libgit.a xdiff/lib.a -lz  -lcrypto
gcc -o merge-tree.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY merge-tree.c
gcc -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -o git-merge-tree   merge-tree.o libgit.a xdiff/lib.a -lz  -lcrypto
gcc -o imap-send.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY imap-send.c
gcc -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -o git-imap-send   imap-send.o libgit.a xdiff/lib.a -lz  -lcrypto
gcc -o merge-recursive.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY merge-recursive.c
gcc -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -o git-merge-recursive   merge-recursive.o libgit.a xdiff/lib.a -lz  -lcrypto
gcc -o ssh-pull.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY ssh-pull.c
gcc -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -o git-ssh-pull   ssh-pull.o rsh.o fetch.o libgit.a xdiff/lib.a -lz  -lcrypto
gcc -o ssh-push.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY ssh-push.c
gcc -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -o git-ssh-push   ssh-push.o rsh.o libgit.a xdiff/lib.a -lz  -lcrypto
gcc -o http.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -DGIT_USER_AGENT='"git/1.4.4-rc2.GIT"' http.c
gcc -o http-fetch.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY http-fetch.c
gcc -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -o git-http-fetch   fetch.o http.o http-fetch.o \
	libgit.a xdiff/lib.a -lz  -lcrypto -lcurl -lexpat
gcc -o http-push.o -c -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY http-push.c
gcc -g -O2 -Wall  -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -o git-http-push   revision.o http.o http-push.o \
	libgit.a xdiff/lib.a -lz  -lcrypto -lcurl -lexpat
rm -f git-bisect git-bisect+
sed -e '1s|#!.*/sh|#!/bin/sh|' \
    -e 's|@@PERL@@|/usr/bin/perl|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    -e 's/@@NO_CURL@@//g' \
    -e 's/@@NO_PYTHON@@//g' \
    git-bisect.sh >git-bisect+
chmod +x git-bisect+
mv git-bisect+ git-bisect
rm -f git-checkout git-checkout+
sed -e '1s|#!.*/sh|#!/bin/sh|' \
    -e 's|@@PERL@@|/usr/bin/perl|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    -e 's/@@NO_CURL@@//g' \
    -e 's/@@NO_PYTHON@@//g' \
    git-checkout.sh >git-checkout+
chmod +x git-checkout+
mv git-checkout+ git-checkout
rm -f git-clean git-clean+
sed -e '1s|#!.*/sh|#!/bin/sh|' \
    -e 's|@@PERL@@|/usr/bin/perl|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    -e 's/@@NO_CURL@@//g' \
    -e 's/@@NO_PYTHON@@//g' \
    git-clean.sh >git-clean+
chmod +x git-clean+
mv git-clean+ git-clean
rm -f git-clone git-clone+
sed -e '1s|#!.*/sh|#!/bin/sh|' \
    -e 's|@@PERL@@|/usr/bin/perl|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    -e 's/@@NO_CURL@@//g' \
    -e 's/@@NO_PYTHON@@//g' \
    git-clone.sh >git-clone+
chmod +x git-clone+
mv git-clone+ git-clone
rm -f git-commit git-commit+
sed -e '1s|#!.*/sh|#!/bin/sh|' \
    -e 's|@@PERL@@|/usr/bin/perl|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    -e 's/@@NO_CURL@@//g' \
    -e 's/@@NO_PYTHON@@//g' \
    git-commit.sh >git-commit+
chmod +x git-commit+
mv git-commit+ git-commit
rm -f git-fetch git-fetch+
sed -e '1s|#!.*/sh|#!/bin/sh|' \
    -e 's|@@PERL@@|/usr/bin/perl|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    -e 's/@@NO_CURL@@//g' \
    -e 's/@@NO_PYTHON@@//g' \
    git-fetch.sh >git-fetch+
chmod +x git-fetch+
mv git-fetch+ git-fetch
rm -f git-ls-remote git-ls-remote+
sed -e '1s|#!.*/sh|#!/bin/sh|' \
    -e 's|@@PERL@@|/usr/bin/perl|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    -e 's/@@NO_CURL@@//g' \
    -e 's/@@NO_PYTHON@@//g' \
    git-ls-remote.sh >git-ls-remote+
chmod +x git-ls-remote+
mv git-ls-remote+ git-ls-remote
rm -f git-merge-one-file git-merge-one-file+
sed -e '1s|#!.*/sh|#!/bin/sh|' \
    -e 's|@@PERL@@|/usr/bin/perl|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    -e 's/@@NO_CURL@@//g' \
    -e 's/@@NO_PYTHON@@//g' \
    git-merge-one-file.sh >git-merge-one-file+
chmod +x git-merge-one-file+
mv git-merge-one-file+ git-merge-one-file
rm -f git-parse-remote git-parse-remote+
sed -e '1s|#!.*/sh|#!/bin/sh|' \
    -e 's|@@PERL@@|/usr/bin/perl|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    -e 's/@@NO_CURL@@//g' \
    -e 's/@@NO_PYTHON@@//g' \
    git-parse-remote.sh >git-parse-remote+
chmod +x git-parse-remote+
mv git-parse-remote+ git-parse-remote
rm -f git-pull git-pull+
sed -e '1s|#!.*/sh|#!/bin/sh|' \
    -e 's|@@PERL@@|/usr/bin/perl|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    -e 's/@@NO_CURL@@//g' \
    -e 's/@@NO_PYTHON@@//g' \
    git-pull.sh >git-pull+
chmod +x git-pull+
mv git-pull+ git-pull
rm -f git-rebase git-rebase+
sed -e '1s|#!.*/sh|#!/bin/sh|' \
    -e 's|@@PERL@@|/usr/bin/perl|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    -e 's/@@NO_CURL@@//g' \
    -e 's/@@NO_PYTHON@@//g' \
    git-rebase.sh >git-rebase+
chmod +x git-rebase+
mv git-rebase+ git-rebase
rm -f git-repack git-repack+
sed -e '1s|#!.*/sh|#!/bin/sh|' \
    -e 's|@@PERL@@|/usr/bin/perl|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    -e 's/@@NO_CURL@@//g' \
    -e 's/@@NO_PYTHON@@//g' \
    git-repack.sh >git-repack+
chmod +x git-repack+
mv git-repack+ git-repack
rm -f git-request-pull git-request-pull+
sed -e '1s|#!.*/sh|#!/bin/sh|' \
    -e 's|@@PERL@@|/usr/bin/perl|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    -e 's/@@NO_CURL@@//g' \
    -e 's/@@NO_PYTHON@@//g' \
    git-request-pull.sh >git-request-pull+
chmod +x git-request-pull+
mv git-request-pull+ git-request-pull
rm -f git-reset git-reset+
sed -e '1s|#!.*/sh|#!/bin/sh|' \
    -e 's|@@PERL@@|/usr/bin/perl|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    -e 's/@@NO_CURL@@//g' \
    -e 's/@@NO_PYTHON@@//g' \
    git-reset.sh >git-reset+
chmod +x git-reset+
mv git-reset+ git-reset
rm -f git-resolve git-resolve+
sed -e '1s|#!.*/sh|#!/bin/sh|' \
    -e 's|@@PERL@@|/usr/bin/perl|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    -e 's/@@NO_CURL@@//g' \
    -e 's/@@NO_PYTHON@@//g' \
    git-resolve.sh >git-resolve+
chmod +x git-resolve+
mv git-resolve+ git-resolve
rm -f git-revert git-revert+
sed -e '1s|#!.*/sh|#!/bin/sh|' \
    -e 's|@@PERL@@|/usr/bin/perl|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    -e 's/@@NO_CURL@@//g' \
    -e 's/@@NO_PYTHON@@//g' \
    git-revert.sh >git-revert+
chmod +x git-revert+
mv git-revert+ git-revert
rm -f git-sh-setup git-sh-setup+
sed -e '1s|#!.*/sh|#!/bin/sh|' \
    -e 's|@@PERL@@|/usr/bin/perl|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    -e 's/@@NO_CURL@@//g' \
    -e 's/@@NO_PYTHON@@//g' \
    git-sh-setup.sh >git-sh-setup+
chmod +x git-sh-setup+
mv git-sh-setup+ git-sh-setup
rm -f git-tag git-tag+
sed -e '1s|#!.*/sh|#!/bin/sh|' \
    -e 's|@@PERL@@|/usr/bin/perl|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    -e 's/@@NO_CURL@@//g' \
    -e 's/@@NO_PYTHON@@//g' \
    git-tag.sh >git-tag+
chmod +x git-tag+
mv git-tag+ git-tag
rm -f git-verify-tag git-verify-tag+
sed -e '1s|#!.*/sh|#!/bin/sh|' \
    -e 's|@@PERL@@|/usr/bin/perl|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    -e 's/@@NO_CURL@@//g' \
    -e 's/@@NO_PYTHON@@//g' \
    git-verify-tag.sh >git-verify-tag+
chmod +x git-verify-tag+
mv git-verify-tag+ git-verify-tag
rm -f git-applymbox git-applymbox+
sed -e '1s|#!.*/sh|#!/bin/sh|' \
    -e 's|@@PERL@@|/usr/bin/perl|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    -e 's/@@NO_CURL@@//g' \
    -e 's/@@NO_PYTHON@@//g' \
    git-applymbox.sh >git-applymbox+
chmod +x git-applymbox+
mv git-applymbox+ git-applymbox
rm -f git-applypatch git-applypatch+
sed -e '1s|#!.*/sh|#!/bin/sh|' \
    -e 's|@@PERL@@|/usr/bin/perl|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    -e 's/@@NO_CURL@@//g' \
    -e 's/@@NO_PYTHON@@//g' \
    git-applypatch.sh >git-applypatch+
chmod +x git-applypatch+
mv git-applypatch+ git-applypatch
rm -f git-am git-am+
sed -e '1s|#!.*/sh|#!/bin/sh|' \
    -e 's|@@PERL@@|/usr/bin/perl|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    -e 's/@@NO_CURL@@//g' \
    -e 's/@@NO_PYTHON@@//g' \
    git-am.sh >git-am+
chmod +x git-am+
mv git-am+ git-am
rm -f git-merge git-merge+
sed -e '1s|#!.*/sh|#!/bin/sh|' \
    -e 's|@@PERL@@|/usr/bin/perl|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    -e 's/@@NO_CURL@@//g' \
    -e 's/@@NO_PYTHON@@//g' \
    git-merge.sh >git-merge+
chmod +x git-merge+
mv git-merge+ git-merge
rm -f git-merge-stupid git-merge-stupid+
sed -e '1s|#!.*/sh|#!/bin/sh|' \
    -e 's|@@PERL@@|/usr/bin/perl|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    -e 's/@@NO_CURL@@//g' \
    -e 's/@@NO_PYTHON@@//g' \
    git-merge-stupid.sh >git-merge-stupid+
chmod +x git-merge-stupid+
mv git-merge-stupid+ git-merge-stupid
rm -f git-merge-octopus git-merge-octopus+
sed -e '1s|#!.*/sh|#!/bin/sh|' \
    -e 's|@@PERL@@|/usr/bin/perl|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    -e 's/@@NO_CURL@@//g' \
    -e 's/@@NO_PYTHON@@//g' \
    git-merge-octopus.sh >git-merge-octopus+
chmod +x git-merge-octopus+
mv git-merge-octopus+ git-merge-octopus
rm -f git-merge-resolve git-merge-resolve+
sed -e '1s|#!.*/sh|#!/bin/sh|' \
    -e 's|@@PERL@@|/usr/bin/perl|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    -e 's/@@NO_CURL@@//g' \
    -e 's/@@NO_PYTHON@@//g' \
    git-merge-resolve.sh >git-merge-resolve+
chmod +x git-merge-resolve+
mv git-merge-resolve+ git-merge-resolve
rm -f git-merge-ours git-merge-ours+
sed -e '1s|#!.*/sh|#!/bin/sh|' \
    -e 's|@@PERL@@|/usr/bin/perl|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    -e 's/@@NO_CURL@@//g' \
    -e 's/@@NO_PYTHON@@//g' \
    git-merge-ours.sh >git-merge-ours+
chmod +x git-merge-ours+
mv git-merge-ours+ git-merge-ours
rm -f git-lost-found git-lost-found+
sed -e '1s|#!.*/sh|#!/bin/sh|' \
    -e 's|@@PERL@@|/usr/bin/perl|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    -e 's/@@NO_CURL@@//g' \
    -e 's/@@NO_PYTHON@@//g' \
    git-lost-found.sh >git-lost-found+
chmod +x git-lost-found+
mv git-lost-found+ git-lost-found
rm -f git-quiltimport git-quiltimport+
sed -e '1s|#!.*/sh|#!/bin/sh|' \
    -e 's|@@PERL@@|/usr/bin/perl|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    -e 's/@@NO_CURL@@//g' \
    -e 's/@@NO_PYTHON@@//g' \
    git-quiltimport.sh >git-quiltimport+
chmod +x git-quiltimport+
mv git-quiltimport+ git-quiltimport
rm -f git-archimport git-archimport+
INSTLIBDIR=`make -C perl -s --no-print-directory instlibdir` && \
sed -e '1{' \
    -e '	s|#!.*perl|#!/usr/bin/perl|' \
    -e '	h' \
    -e '	s=.*=use lib (split(/:/, $ENV{GITPERLLIB} || "@@INSTLIBDIR@@"));=' \
    -e '	H' \
    -e '	x' \
    -e '}' \
    -e 's|@@INSTLIBDIR@@|'"$INSTLIBDIR"'|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    git-archimport.perl >git-archimport+
chmod +x git-archimport+
mv git-archimport+ git-archimport
rm -f git-cvsimport git-cvsimport+
INSTLIBDIR=`make -C perl -s --no-print-directory instlibdir` && \
sed -e '1{' \
    -e '	s|#!.*perl|#!/usr/bin/perl|' \
    -e '	h' \
    -e '	s=.*=use lib (split(/:/, $ENV{GITPERLLIB} || "@@INSTLIBDIR@@"));=' \
    -e '	H' \
    -e '	x' \
    -e '}' \
    -e 's|@@INSTLIBDIR@@|'"$INSTLIBDIR"'|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    git-cvsimport.perl >git-cvsimport+
chmod +x git-cvsimport+
mv git-cvsimport+ git-cvsimport
rm -f git-relink git-relink+
INSTLIBDIR=`make -C perl -s --no-print-directory instlibdir` && \
sed -e '1{' \
    -e '	s|#!.*perl|#!/usr/bin/perl|' \
    -e '	h' \
    -e '	s=.*=use lib (split(/:/, $ENV{GITPERLLIB} || "@@INSTLIBDIR@@"));=' \
    -e '	H' \
    -e '	x' \
    -e '}' \
    -e 's|@@INSTLIBDIR@@|'"$INSTLIBDIR"'|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    git-relink.perl >git-relink+
chmod +x git-relink+
mv git-relink+ git-relink
rm -f git-shortlog git-shortlog+
INSTLIBDIR=`make -C perl -s --no-print-directory instlibdir` && \
sed -e '1{' \
    -e '	s|#!.*perl|#!/usr/bin/perl|' \
    -e '	h' \
    -e '	s=.*=use lib (split(/:/, $ENV{GITPERLLIB} || "@@INSTLIBDIR@@"));=' \
    -e '	H' \
    -e '	x' \
    -e '}' \
    -e 's|@@INSTLIBDIR@@|'"$INSTLIBDIR"'|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    git-shortlog.perl >git-shortlog+
chmod +x git-shortlog+
mv git-shortlog+ git-shortlog
rm -f git-rerere git-rerere+
INSTLIBDIR=`make -C perl -s --no-print-directory instlibdir` && \
sed -e '1{' \
    -e '	s|#!.*perl|#!/usr/bin/perl|' \
    -e '	h' \
    -e '	s=.*=use lib (split(/:/, $ENV{GITPERLLIB} || "@@INSTLIBDIR@@"));=' \
    -e '	H' \
    -e '	x' \
    -e '}' \
    -e 's|@@INSTLIBDIR@@|'"$INSTLIBDIR"'|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    git-rerere.perl >git-rerere+
chmod +x git-rerere+
mv git-rerere+ git-rerere
rm -f git-cvsserver git-cvsserver+
INSTLIBDIR=`make -C perl -s --no-print-directory instlibdir` && \
sed -e '1{' \
    -e '	s|#!.*perl|#!/usr/bin/perl|' \
    -e '	h' \
    -e '	s=.*=use lib (split(/:/, $ENV{GITPERLLIB} || "@@INSTLIBDIR@@"));=' \
    -e '	H' \
    -e '	x' \
    -e '}' \
    -e 's|@@INSTLIBDIR@@|'"$INSTLIBDIR"'|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    git-cvsserver.perl >git-cvsserver+
chmod +x git-cvsserver+
mv git-cvsserver+ git-cvsserver
rm -f git-svnimport git-svnimport+
INSTLIBDIR=`make -C perl -s --no-print-directory instlibdir` && \
sed -e '1{' \
    -e '	s|#!.*perl|#!/usr/bin/perl|' \
    -e '	h' \
    -e '	s=.*=use lib (split(/:/, $ENV{GITPERLLIB} || "@@INSTLIBDIR@@"));=' \
    -e '	H' \
    -e '	x' \
    -e '}' \
    -e 's|@@INSTLIBDIR@@|'"$INSTLIBDIR"'|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    git-svnimport.perl >git-svnimport+
chmod +x git-svnimport+
mv git-svnimport+ git-svnimport
rm -f git-cvsexportcommit git-cvsexportcommit+
INSTLIBDIR=`make -C perl -s --no-print-directory instlibdir` && \
sed -e '1{' \
    -e '	s|#!.*perl|#!/usr/bin/perl|' \
    -e '	h' \
    -e '	s=.*=use lib (split(/:/, $ENV{GITPERLLIB} || "@@INSTLIBDIR@@"));=' \
    -e '	H' \
    -e '	x' \
    -e '}' \
    -e 's|@@INSTLIBDIR@@|'"$INSTLIBDIR"'|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    git-cvsexportcommit.perl >git-cvsexportcommit+
chmod +x git-cvsexportcommit+
mv git-cvsexportcommit+ git-cvsexportcommit
rm -f git-send-email git-send-email+
INSTLIBDIR=`make -C perl -s --no-print-directory instlibdir` && \
sed -e '1{' \
    -e '	s|#!.*perl|#!/usr/bin/perl|' \
    -e '	h' \
    -e '	s=.*=use lib (split(/:/, $ENV{GITPERLLIB} || "@@INSTLIBDIR@@"));=' \
    -e '	H' \
    -e '	x' \
    -e '}' \
    -e 's|@@INSTLIBDIR@@|'"$INSTLIBDIR"'|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    git-send-email.perl >git-send-email+
chmod +x git-send-email+
mv git-send-email+ git-send-email
rm -f git-svn git-svn+
INSTLIBDIR=`make -C perl -s --no-print-directory instlibdir` && \
sed -e '1{' \
    -e '	s|#!.*perl|#!/usr/bin/perl|' \
    -e '	h' \
    -e '	s=.*=use lib (split(/:/, $ENV{GITPERLLIB} || "@@INSTLIBDIR@@"));=' \
    -e '	H' \
    -e '	x' \
    -e '}' \
    -e 's|@@INSTLIBDIR@@|'"$INSTLIBDIR"'|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    git-svn.perl >git-svn+
chmod +x git-svn+
mv git-svn+ git-svn
rm -f git-merge-recursive-old git-merge-recursive-old+
sed -e '1s|#!.*python|#!/usr/bin/python|' \
    -e 's|@@GIT_PYTHON_PATH@@|/var/tmp/ggg/share/git-core/python|g' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    git-merge-recursive-old.py >git-merge-recursive-old+
chmod +x git-merge-recursive-old+
mv git-merge-recursive-old+ git-merge-recursive-old
cp git-revert git-cherry-pick+
mv git-cherry-pick+ git-cherry-pick
cp git-commit git-status+
mv git-status+ git-status
rm -f gitweb/gitweb.cgi gitweb/gitweb.cgi+
sed -e '1s|#!.*perl|#!/usr/bin/perl|' \
    -e 's|++GIT_VERSION++|1.4.4-rc2.GIT|g' \
    -e 's|++GIT_BINDIR++|/var/tmp/ggg/bin|g' \
    -e 's|++GITWEB_CONFIG++|gitweb_config.perl|g' \
    -e 's|++GITWEB_HOME_LINK_STR++|projects|g' \
    -e 's|++GITWEB_SITENAME++||g' \
    -e 's|++GITWEB_PROJECTROOT++|/pub/git|g' \
    -e 's|++GITWEB_EXPORT_OK++||g' \
    -e 's|++GITWEB_STRICT_EXPORT++||g' \
    -e 's|++GITWEB_BASE_URL++||g' \
    -e 's|++GITWEB_LIST++||g' \
    -e 's|++GITWEB_HOMETEXT++|indextext.html|g' \
    -e 's|++GITWEB_CSS++|gitweb.css|g' \
    -e 's|++GITWEB_LOGO++|git-logo.png|g' \
    -e 's|++GITWEB_FAVICON++|git-favicon.png|g' \
    -e 's|++GITWEB_SITE_HEADER++||g' \
    -e 's|++GITWEB_SITE_FOOTER++||g' \
    gitweb/gitweb.perl >gitweb/gitweb.cgi+
chmod +x gitweb/gitweb.cgi+
mv gitweb/gitweb.cgi+ gitweb/gitweb.cgi
rm -f git-instaweb git-instaweb+
sed -e '1s|#!.*/sh|#!/bin/sh|' \
    -e 's/@@GIT_VERSION@@/1.4.4-rc2.GIT/g' \
    -e 's/@@NO_CURL@@//g' \
    -e 's/@@NO_PYTHON@@//g' \
    -e '/@@GITWEB_CGI@@/r gitweb/gitweb.cgi' \
    -e '/@@GITWEB_CGI@@/d' \
    -e '/@@GITWEB_CSS@@/r gitweb/gitweb.css' \
    -e '/@@GITWEB_CSS@@/d' \
    git-instaweb.sh > git-instaweb+
chmod +x git-instaweb+
mv git-instaweb+ git-instaweb
rm -f git-merge-recur && ln git-merge-recursive git-merge-recur
rm -f git-format-patch && ln git git-format-patch
rm -f git-show && ln git git-show
rm -f git-whatchanged && ln git git-whatchanged
rm -f git-cherry && ln git git-cherry
rm -f git-get-tar-commit-id && ln git git-get-tar-commit-id
rm -f git-add && ln git git-add
rm -f git-annotate && ln git git-annotate
rm -f git-apply && ln git git-apply
rm -f git-archive && ln git git-archive
rm -f git-blame && ln git git-blame
rm -f git-branch && ln git git-branch
rm -f git-cat-file && ln git git-cat-file
rm -f git-checkout-index && ln git git-checkout-index
rm -f git-check-ref-format && ln git git-check-ref-format
rm -f git-commit-tree && ln git git-commit-tree
rm -f git-count-objects && ln git git-count-objects
rm -f git-diff && ln git git-diff
rm -f git-diff-files && ln git git-diff-files
rm -f git-diff-index && ln git git-diff-index
rm -f git-diff-stages && ln git git-diff-stages
rm -f git-diff-tree && ln git git-diff-tree
rm -f git-fmt-merge-msg && ln git git-fmt-merge-msg
rm -f git-for-each-ref && ln git git-for-each-ref
rm -f git-grep && ln git git-grep
rm -f git-init-db && ln git git-init-db
rm -f git-log && ln git git-log
rm -f git-ls-files && ln git git-ls-files
rm -f git-ls-tree && ln git git-ls-tree
rm -f git-mailinfo && ln git git-mailinfo
rm -f git-mailsplit && ln git git-mailsplit
rm -f git-mv && ln git git-mv
rm -f git-name-rev && ln git git-name-rev
rm -f git-pack-objects && ln git git-pack-objects
rm -f git-prune && ln git git-prune
rm -f git-prune-packed && ln git git-prune-packed
rm -f git-push && ln git git-push
rm -f git-read-tree && ln git git-read-tree
rm -f git-repo-config && ln git git-repo-config
rm -f git-rev-list && ln git git-rev-list
rm -f git-rev-parse && ln git git-rev-parse
rm -f git-rm && ln git git-rm
rm -f git-runstatus && ln git git-runstatus
rm -f git-show-branch && ln git git-show-branch
rm -f git-stripspace && ln git git-stripspace
rm -f git-symbolic-ref && ln git git-symbolic-ref
rm -f git-tar-tree && ln git git-tar-tree
rm -f git-unpack-objects && ln git git-unpack-objects
rm -f git-update-index && ln git git-update-index
rm -f git-update-ref && ln git git-update-ref
rm -f git-upload-archive && ln git git-upload-archive
rm -f git-write-tree && ln git git-write-tree
rm -f git-show-ref && ln git git-show-ref
rm -f git-pack-refs && ln git git-pack-refs
make -C perl
make[1]: Entering directory `/VMware/kernel/git/git/perl'
cp private-Error.pm blib/lib/Error.pm
cp Git.pm blib/lib/Git.pm
Manifying blib/man3/private-Error.3pm
Manifying blib/man3/Git.3pm
make[1]: Leaving directory `/VMware/kernel/git/git/perl'
make -C templates
make[1]: Entering directory `/VMware/kernel/git/git/templates'
ls *--* 2>/dev/null | \
while read boilerplate; \
do \
	case "$boilerplate" in *~) continue ;; esac && \
	dst=`echo "$boilerplate" | sed -e 's|^this|.|;s|--|/|g'` && \
	dir=`expr "$dst" : '\(.*\)/'` && \
	mkdir -p blt/$dir && \
	case "$boilerplate" in \
	*--) ;; \
	*) cp $boilerplate blt/$dst ;; \
	esac || exit; \
done || exit
date >boilerplates.made
: no custom templates yet
make[1]: Leaving directory `/VMware/kernel/git/git/templates'
install -d -m755 '/var/tmp/ggg/bin'
install -d -m755 '/var/tmp/ggg/bin'
install git-convert-objects git-fetch-pack git-fsck-objects git-hash-object git-index-pack git-local-fetch git-merge-base git-daemon git-merge-index git-mktag git-mktree git-patch-id git-peek-remote git-receive-pack git-send-pack git-shell git-show-index git-ssh-fetch git-ssh-upload git-unpack-file git-update-server-info git-upload-pack git-verify-pack git-pack-redundant git-var git-describe git-merge-tree git-imap-send git-merge-recursive  git-ssh-pull git-ssh-push git-http-fetch git-http-push git-bisect git-checkout git-clean git-clone git-commit git-fetch git-ls-remote git-merge-one-file git-parse-remote git-pull git-rebase git-repack git-request-pull git-reset git-resolve git-revert git-sh-setup git-tag git-verify-tag git-applymbox git-applypatch git-am git-merge git-merge-stupid git-merge-octopus git-merge-resolve git-merge-ours git-lost-found git-quiltimport git-archimport git-cvsimport git-relink git-shortlog git-rerere git-cvsserver git-svnimport git-cvsexportcommit git-send-email git-svn git-merge-recursive-old git-cherry-pick git-status git-instaweb git-merge-recur '/var/tmp/ggg/bin'
install git gitk '/var/tmp/ggg/bin'
make -C templates DESTDIR='' install
make[1]: Entering directory `/VMware/kernel/git/git/templates'
: no custom templates yet
install -d -m755 '/var/tmp/ggg/share/git-core/templates/'
(cd blt && tar cf - .) | \
(cd '/var/tmp/ggg/share/git-core/templates/' && tar xf -)
tar: This does not look like a tar archive
tar: Skipping to next header
tar: Archive contains obsolescent base-64 headers
tar: Error exit delayed from previous errors
make[1]: *** [install] Error 2
make[1]: Leaving directory `/VMware/kernel/git/git/templates'
make: *** [install] Error 2

^ permalink raw reply

* Re: Cleaning up git user-interface warts
From: Linus Torvalds @ 2006-11-15 18:03 UTC (permalink / raw)
  To: Nicolas Pitre; +Cc: Junio C Hamano, git
In-Reply-To: <Pine.LNX.4.64.0611142306090.2591@xanadu.home>



On Tue, 14 Nov 2006, Nicolas Pitre wrote:
> 
> But the fact is that HG (which has a growing crowd of happy campers, 
> maybe even larger than the BK crowd now) did work with and got used to a 
> sensible definition of what a "pull" is.

Guys, before you start thinking this way, the fact is, there's a lot of 
happy git users. 

So the reason for using "git pull" is

 - bk did it that way, and like it or not, bk was the first usable 
   distributed system. hg is totally uninteresting.

 - git itself has now done it that way for the last 18 months, and the 
   fact is, the people _complaining_ are a small subset of the people who 
   actually use git on a daily basis and don't complain.

So don't fall for the classic "second system syndrome". The classic reason 
for getting the second system wrong is because you focus on the issues 
people complain about, and not on the issues that work well (because the 
issues that work fine are obviously not getting a lot of attention).

If you think "pull" is confusing, I can guarantee you that _changing_ the 
name is a hell of a lot more confusing. In fact, I think a lot of the 
confusion comes from cogito, not from git - the fact that cogito used 
different names and different syntax was a mistake, I think.

And that '#' for branch naming in particular was (and is) total 
braindamage. The native git branch naming convention is just fundamentally 
much better, and allows you to very naturally fetch multiple branches at 
once, in a way that cogito's syntax does not.

So when I see suggestions of using that brain-damaged cogito syntax as an 
"improvement", I know for a fact that somebody hasn't thought things 
through, and only thinks it's a better syntax beause of totally bogus 
reasons.

I do agree that we probably could/should re-use the "git merge" name. The 
current "git merge" is an esoteric internal routine, and I doubt a lot of 
people use it as-is. I don't think it would be a mistake to make "git 
merge" basically be an alias for "git pull", for example, and I doubt many 
people would really even notice.

But the fact is, git isn't really that hard to work out, and the commands 
aren't that complicated. There's no reason to rename them. We do have 
other problems:

 - default branch selection for merging is broken (it should definitely 
   take the current branch into account). When I do "git pull" with no 
   branch specification, and I happen to be on a branch that is associated 
   with something else than "master" in the remote, I shouldn't merge with 
   master.

 - I agree that having to create temporary branches to just look at a tag 
   that you don't want to actually develop on is just unnecessarily 
   bothersome.

But trying to rename "pull" (or the "git" name itself) is just going to 
cause more confusion than you fix.


^ permalink raw reply

* Re: Cleaning up git user-interface warts
From: Junio C Hamano @ 2006-11-15 17:59 UTC (permalink / raw)
  To: Nicolas Pitre; +Cc: git
In-Reply-To: <Pine.LNX.4.64.0611151023160.2591@xanadu.home>

Nicolas Pitre <nico@cam.org> writes:

> But again I think it is important that the URL to use must be a per 
> branch attribute i.e. attached to "default/master" and not just 
> "default".  This way someone could add all branches of interest into the 
> "default" group even if they're from different repositories, and a 
> simple  get without any argument would get them all.

I think the "one group per one remote repository" model is a lot
easier to explain.  At least when I read your first "branch
group" proposal that was I thought was going on and I found it
quite sensible (and it maps more or less straightforwardly to
the way existing .git/refs/remotes is set up by default).

^ permalink raw reply

* Re: Cleaning up git user-interface warts
From: Junio C Hamano @ 2006-11-15 17:55 UTC (permalink / raw)
  To: Andy Parkins; +Cc: git
In-Reply-To: <200611150917.23756.andyparkins@gmail.com>

Andy Parkins <andyparkins@gmail.com> writes:

>> 3) remote branch handling should become more straight forward.
>
> I was completely confused by this origin/master/clone stuff when I started 
> with git.  In hindsight, now I understand git a bit more, this is what I 
> would have liked:
>
>  * Don't use the name "origin" twice.  In fact, don't use it at all.  In a 
> distributed system there is no such thing as a true origin.
>
>  * .git/remotes/origin should be ".git/remotes/default".   "origin" is only 
> special because it is the default to push and pull - it's very nice to have a 
> default, but it should therefore be /called/ "default".

I think the naming is just a minor detail and can be overridden
with "clone --origin" already.  Renaming it to default is just
like making separate-remote the default to me -- it is fine as
long as it does not break people's expectations.

>  * If clone really wants to have a non-read-only master, then that should 
> be .git/refs/heads/master and will initialise 
> to .git/refs/remotes/$name/master after cloning.  Personally I think this is 
> dangerous because it assumes there is a "master" upstream - which git doesn't 
> mandate at all.  Maybe it would be better to take the upstream HEAD and 
> create a local branch for /that/ branch rather than require that it is 
> called "master".

I think the latter is what clone has done always; take remote's
HEAD and use that to initialize local master (there is no
confusion coming from multiple peer repositories because you
clone from only one place to initialize the repository -- that
one _is_ the origin), and we even keep the HEAD pointing at the
remote's master or whatever it points at at the remote.  Using
"$name" as an object name uses .git/refs/remotes/$name/HEAD.

>  * git-clone should really just be a small wrapper around
>...
> If git-clone does anything that can't be done with settings in the config 
> and the remotes/default file then it's wrong.  The reason I say this is that 
> as soon as git-clone has special capabilities (like --shared, --local 
> and --reference) then you are prevented from doing magic with existing 
> repositories.

That is not entirely true.  clone has convenience because people
asked.  It does not have to mean you are not allowed to give
similar convenience to other commands.  Patches?

> branches from two other local repositories that have the objects hard linked?

fetch by second local repository with git-local-fetch perhaps.

> There have been lots of "wishlist" posts lately; would it be
> useful if I tried to collect all these suggestions from
> various people into one place to try and get a picture of any
> consensus?

A list of common things wished by people certainly is a handy
thing to have.

A consensus would not write code and it generally does not take
technology into account to tell what is realistic and what is
not, so the result needs to be take with a grain of salt,
though.

^ permalink raw reply

* Re: Missing features in git
From: Linus Torvalds @ 2006-11-15 16:50 UTC (permalink / raw)
  To: Karl Hasselström; +Cc: linux, git
In-Reply-To: <20061115073546.GD5453@diana.vm.bytemark.co.uk>

[-- Attachment #1: Type: TEXT/PLAIN, Size: 1021 bytes --]



On Wed, 15 Nov 2006, Karl Hasselström wrote:

> On 2006-11-14 16:38:00 -0500, linux@horizon.com wrote:
> 
> > It also removes a paragraph of excuses from some "using git" docs
> > I'm writing. It's a lot easier to explain why you can't commit if
> > you're not on a branch than to explain why you can't not be on a
> > branch.
> 
> This is precisely why writing documentation is such a good idea: It is
> in many cases easier to fix the warts than finding a pedagogical way
> to explain them. :-)

Heh. Pretty much all of the early git plumbing came about when I started 
to try to demonstrate git to others, and wrote some of the early 
tutorials. So yeah, trying to explain something to others (whether by 
documentation or through examples) is a good way to show what has bad 
interfaces.

Even if it's easy to use for yourself (I had my own scripts to do 
everything _I_ wanted to do), trying to explain why something is done some 
way to somebody who doesn't know the internals is always a good exercise.

		Linus

^ permalink raw reply

* [PATCH] Seek back to current filepos when mmap()ing with NO_MMAP
From: Johannes Schindelin @ 2006-11-15 16:27 UTC (permalink / raw)
  To: junkio, git


"git-index-pack --fix-thin" relies on mmap() not changing the current
file position (otherwise the pack will be corrupted when writing the
final SHA1). Meet that expectation.

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
---

	Sorry for not catching that earlier. It only affects platforms
	where you have to set NO_MMAP=YesPlease, anyway.

 compat/mmap.c |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/compat/mmap.c b/compat/mmap.c
index 55cb120..a4d2e50 100644
--- a/compat/mmap.c
+++ b/compat/mmap.c
@@ -7,6 +7,7 @@
 void *gitfakemmap(void *start, size_t length, int prot , int flags, int fd, off_t offset)
 {
 	int n = 0;
+	off_t current_offset = lseek(fd, 0, SEEK_CUR);
 
 	if (start != NULL || !(flags & MAP_PRIVATE))
 		die("Invalid usage of gitfakemmap.");
@@ -39,6 +40,11 @@ void *gitfakemmap(void *start, size_t le
 		n += count;
 	}
 
+	if (current_offset != lseek(fd, current_offset, SEEK_SET)) {
+		errno = EINVAL;
+		return MAP_FAILED;
+	}
+
 	return start;
 }
 
-- 
dummy-dirty

^ permalink raw reply related

* Re: git tag: don't complain of empty messages
From: Johannes Schindelin @ 2006-11-15 16:19 UTC (permalink / raw)
  To: Han-Wen Nienhuys; +Cc: git
In-Reply-To: <455B3AC2.10107@xs4all.nl>

Hi,

On Wed, 15 Nov 2006, Han-Wen Nienhuys wrote:

> Without a message, the tag can still be identified by its name, which is 
> in the tag object contents.

You are correct. Acked-by: me.

Ciao,
Dscho

^ permalink raw reply

* Re: git tag: don't complain of empty messages
From: Han-Wen Nienhuys @ 2006-11-15 16:05 UTC (permalink / raw)
  To: Johannes Schindelin; +Cc: git
In-Reply-To: <Pine.LNX.4.63.0611151657570.13772@wbgn013.biozentrum.uni-wuerzburg.de>

Johannes Schindelin escreveu:
> Hi,
> 
> On Wed, 15 Nov 2006, Han-Wen Nienhuys wrote:
> 
>> GIT refuses to set annotated tags without a comment. I think this is a silly
>> restriction when the message is explicitly set to the empty string.
> 
> I think that this behaviour is on purpose: The tag will be identified 
> (like all objects in git) by its contents. The rationale: the filename 
> does not matter, since the tag _object_ is not identified by it. So, in 
> case you lose your .git/refs/tags/ directory, you can still reconstruct 
> the tags with "git-fsck-objects --full".

Without a message, the tag can still be identified by its name, which is 
in the tag object contents.

-- 

^ permalink raw reply

* Re: git tag: don't complain of empty messages
From: Johannes Schindelin @ 2006-11-15 16:02 UTC (permalink / raw)
  To: Han-Wen Nienhuys; +Cc: git
In-Reply-To: <ejfc1t$6am$1@sea.gmane.org>

Hi,

On Wed, 15 Nov 2006, Han-Wen Nienhuys wrote:

> GIT refuses to set annotated tags without a comment. I think this is a silly
> restriction when the message is explicitly set to the empty string.

I think that this behaviour is on purpose: The tag will be identified 
(like all objects in git) by its contents. The rationale: the filename 
does not matter, since the tag _object_ is not identified by it. So, in 
case you lose your .git/refs/tags/ directory, you can still reconstruct 
the tags with "git-fsck-objects --full".

Ciao,
Dscho

^ permalink raw reply

* Re: Cleaning up git user-interface warts
From: Nicolas Pitre @ 2006-11-15 15:41 UTC (permalink / raw)
  To: Andy Parkins; +Cc: git
In-Reply-To: <200611150917.23756.andyparkins@gmail.com>

On Wed, 15 Nov 2006, Andy Parkins wrote:

> On Wednesday 2006 November 15 04:32, Nicolas Pitre wrote:
> 
> > OK..... let's pretend this is my follow-up to your "If I were redoing
> 
> Personally, I agree with almost everything in this email.  Except the 
> implementation of point 3.
> 
> > 3) remote branch handling should become more straight forward.
> 
> I was completely confused by this origin/master/clone stuff when I started 
> with git.  In hindsight, now I understand git a bit more, this is what I 
> would have liked:
> 
>  * Don't use the name "origin" twice.  In fact, don't use it at all.  In a 
> distributed system there is no such thing as a true origin.

I agree, sort of.  Not because"origin" is ambigous as a name.  But 
rather because there is a magic translation from "master" to "origin", 
and I think this is wrong to do that.

As mentioned elsewhere (and let's start using "get" instead of "pull" as 
suggested by Johannes), a "get" should probably always create a branch 
group even if it contains only one branch.  This way the remote branch 
called "master" will still be called "master" locally, under the branch 
group used to represent the remote repository.  And if a local name is 
not provided then let's just call it "default".  This way, amongst the 
remote references, there would be a "default/master" that would be used 
when nothing else is provided by the user. So...

	git get repo.com/time_machine.git

would create a local branch named "remotes/default/master" if the remote 
repo has only a master branch.

Then, a simple:

	git merge

could be the same as

	git merge default

which would be equivalent to

	git merge default/master

Afterwards, because the "default" remote already exists, then:

	git get

would be the same as

	git get default

to get changes for all branches in the "default" remote branches, of 
which "master" might be the only one in the simple case.

But again I think it is important that the URL to use must be a per 
branch attribute i.e. attached to "default/master" and not just 
"default".  This way someone could add all branches of interest into the 
"default" group even if they're from different repositories, and a 
simple  get without any argument would get them all.



^ permalink raw reply

* git tag: don't complain of empty messages
From: Han-Wen Nienhuys @ 2006-11-15 15:34 UTC (permalink / raw)
  To: git

[-- Attachment #1: Type: text/plain, Size: 401 bytes --]


Hello,

GIT refuses to set annotated tags without a comment. I think this is a 
silly restriction when the message is explicitly set to the empty string.

The attached patch should fix this;  Unfortunately, I've been unable to 
test it. Running the script with sh -x stops at

++exec /home/hanwen/usr/pkg/git/bin/git-sh-setup

-- 
  Han-Wen Nienhuys - hanwen@xs4all.nl - http://www.xs4all.nl/~hanwen

[-- Attachment #2: tagpatch --]
[-- Type: text/plain, Size: 1165 bytes --]

commit 446cfbd9edcfaf5fe76f597823e0e3314d091489
Author: Han-Wen Nienhuys <hanwen@lilypond.org>
Date:   Wed Nov 15 16:27:27 2006 +0100

    always set tag if -m is given, even if empty

diff --git a/git-tag.sh b/git-tag.sh
index ac269e3..f2533a3 100755
--- a/git-tag.sh
+++ b/git-tag.sh
@@ -5,6 +5,7 @@ USAGE='-l [<pattern>] | [-a | -s | -u <k
 SUBDIRECTORY_OK='Yes'
 . git-sh-setup
 
+message_given=
 annotate=
 signed=
 force=
@@ -37,6 +38,7 @@ do
     	annotate=1
 	shift
 	message="$1"
+	message_given=1
 	;;
     -u)
 	annotate=1
@@ -83,7 +85,7 @@ tagger=$(git-var GIT_COMMITTER_IDENT) ||
 trap 'rm -f "$GIT_DIR"/TAG_TMP* "$GIT_DIR"/TAG_FINALMSG "$GIT_DIR"/TAG_EDITMSG' 0
 
 if [ "$annotate" ]; then
-    if [ -z "$message" ]; then
+    if [ -z "$message_given" ]; then
         ( echo "#"
           echo "# Write a tag message"
           echo "#" ) > "$GIT_DIR"/TAG_EDITMSG
@@ -95,7 +97,7 @@ if [ "$annotate" ]; then
     grep -v '^#' <"$GIT_DIR"/TAG_EDITMSG |
     git-stripspace >"$GIT_DIR"/TAG_FINALMSG
 
-    [ -s "$GIT_DIR"/TAG_FINALMSG ] || {
+    [ -s "$GIT_DIR"/TAG_FINALMSG -o -n "$message_given" ] || {
 	echo >&2 "No tag message?"
 	exit 1
     }

^ permalink raw reply related

* Re: [ANNOUNCE] qgit-1.5.3
From: Marco Costalba @ 2006-11-15 15:23 UTC (permalink / raw)
  To: Andreas Ericsson; +Cc: Git Mailing List, linux-kernel
In-Reply-To: <45585749.5030200@op5.se>

On 11/13/06, Andreas Ericsson <ae@op5.se> wrote:
> Marco Costalba wrote:
> >
> > Download tarball from http://www.sourceforge.net/projects/qgit
> > or directly from git public repository
> > git://git.kernel.org/pub/scm/qgit/qgit.git
> >
>
> Love the tool, but can't fetch the tag. Did you forget to
>
>         $ git push origin 1.5.3
>

I think I have pushed the new tag, indeed the gitweb interface on
kernel.org/git shows correctly the 1.5.3 tag (and also two new commits
after that).

I've also pulled from kernel.org/git/qgit in a test repository and got
the tag succesfully.

I'm not able to reproduce this, in any case I will push again the tags.

Thanks

^ permalink raw reply

* Re: Cleaning up git user-interface warts
From: Nicolas Pitre @ 2006-11-15 15:10 UTC (permalink / raw)
  To: Johannes Schindelin; +Cc: Junio C Hamano, git, Andy Whitcroft, Carl Worth
In-Reply-To: <Pine.LNX.4.63.0611151454250.13772@wbgn013.biozentrum.uni-wuerzburg.de>

On Wed, 15 Nov 2006, Johannes Schindelin wrote:

> On Tue, 14 Nov 2006, Junio C Hamano wrote:
> 
> > Nicolas Pitre <nico@cam.org> writes:
> > 
> > > 2) "pull" and "push" should be symmetrical operations
> > 
> > I think that makes a lot of sense to have "gh pull" and "gh
> > push" as symmetric operations, and make "gh merge" do the
> > fast-forward and 3-way merge magic done in the current "git
> > pull".  These three words would have a lot saner meaning.
> 
> I am really opposed to do "gh pull". Not only because of "gh" being 
> completely confusing (we already _have_ "git", and for porcelains 
> different TLAs), but "pull" _really_ is confusing by now. And Mercurial 
> did not help one wit by insisting on their own interpretation.

I completely agree that creating yet another command prefix for 
basically the same tools would be a disaster.  We have "git" already so 
let's stick to it and make its usage just more sane.

> Why not do something like "get/put" instead? It is
> 
> - easier to remember
> - not bogus (AFAICT the meaning is not used in diametrical senses)
> - shorter to type than download/upload

Well, of all compromizes this is probably the best one so far.  I would 
have prefered to bite the bullet and fix "pull" instead of adding yet 
more commands.  But if the consensus is that there is no way on earth 
that "pull" can be salvaged then get/put is probably more enjoyable than 
download/upload.  This way pull/fetch/push could still be available 
(albeit burried somewhere out of sight).



^ permalink raw reply

* Re: Cleaning up git user-interface warts
From: Sean @ 2006-11-15 15:03 UTC (permalink / raw)
  To: Johannes Schindelin
  Cc: Junio C Hamano, Nicolas Pitre, git, Andy Whitcroft, Carl Worth
In-Reply-To: <Pine.LNX.4.63.0611151454250.13772@wbgn013.biozentrum.uni-wuerzburg.de>

On Wed, 15 Nov 2006 15:01:47 +0100 (CET)
Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:

> I am really opposed to do "gh pull". Not only because of "gh" being 
> completely confusing (we already _have_ "git", and for porcelains 
> different TLAs), but "pull" _really_ is confusing by now. And Mercurial 
> did not help one wit by insisting on their own interpretation.

This makes a lot of sense.  The "git" command isn't damaged so bad
that it can't be saved in a backward compatible way, at least for
a transition period.  Adding a new command name seems like a step
backward.
 
> Why not do something like "get/put" instead? It is
> 
> - easier to remember
> - not bogus (AFAICT the meaning is not used in diametrical senses)
> - shorter to type than download/upload
> 
> As for "git merge": Just by the number of arguments you can discern 
> between the original usage and the new usage, so I am all in favour of 
> replacing "git pull <blabla>" by "git merge <blabla>". Where "<blabla>" 
> can be a branch or a remote or a URL (with cogito style #branchname).

Both these ideas sound like a step in the right direction too.


^ permalink raw reply

* Re: Cleaning up git user-interface warts
From: Nicolas Pitre @ 2006-11-15 14:56 UTC (permalink / raw)
  To: Jakub Narebski; +Cc: git
In-Reply-To: <ejeotu$vrj$3@sea.gmane.org>

On Wed, 15 Nov 2006, Jakub Narebski wrote:

> Nicolas Pitre wrote:
> 
> > On Tue, 14 Nov 2006, Junio C Hamano wrote:
> > 
> >> Yes.  The current "merge" started its life as Linus's porcelain
> >> (we did not have fetch and pull infrastructure back then) but
> >> quickly has become just a helper for pull to produce a merge
> >> commit.  If anybody thinks its UI is good as a general end-user
> >> level command, there is a need for "head examination".
> > 
> > If you mean "git merge" it sure needs to be brought forward.  It can't 
> > be clearer than:
> > 
> >       git-merge the_other_branch
> > 
> > or
> > 
> >       git-merge git://repo.com/time_machine.git
> > 
> > to instantaneously understand what is going on.
> 
> You mean
> 
>       git merge git://repo.com/time_machine.git#branch
> 
> don't you (perhaps with 'master' as default branch)?

Something like that.  I wantee to enphasize on the "merge" command that 
should deal with, hey, merges.

I don't know if # is a good choice for branch indicator though.



^ permalink raw reply


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox