git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: Uninstalling Git

From
David Kastrup <dak@gnu.org>
Date
Sep 23, 2007, 19:06 UTC
Message-ID
<85d4w9mcb6.fsf@lola.goethe.zz>
In-Reply-To
<46F6B0CC.3040000@gmx.net>
in-call@gmx.net writes:
Show 12 quoted lines
> This must be a stupid-obvious-newbie question but...
>
> Well, the point is that I installed the git version 1.5.2.1 in an
> ubuntu box.  That was done following the INSTALL instructions in the
> corresponding tarball.  I typed:
>
> $ make configure
> $ ./configure --prefix=/usr/local
> $ make all doc
> $ sudo make install install-doc
>
> First, I'd like to uninstall the thing completely, how do I do that?

Basically, you are screwed. That being said, it might somewhat work to do the following:

find /usr/local -depth -iname 'git*' -exec rm -rf {} \;

But I think you'll catch more if you apply the following patch, then do

./configure --prefix=/opt/git make all doc sudo make install install-doc install-symlinks sudo rm -rf /opt/git sudo find /usr/local -lname '/opt/git/*' -delete

> Second, what would be the correct procedure to follow if I would
> like just to upgrade to a newer version? install over the older
> perhaps? Is that always safe in the sense that there won't be any
> dangling piece of bin nor doc?

There is some software called xstow which is supposed to do something similar to the "install-symlinks" target of this patch.

-- 
David Kastrup, Kriemhildstr. 15, 44793 Bochum

From: David Kastrup <dak@gnu.org>
Date: Wed, 18 Jul 2007 16:45:36 +0200
Subject: [PATCH] Makefile: create an install-symlinks target

[commit text mostly pinched from INSTALL]

An alternative global installation method making it much easier to
uninstall is to use a package-specific prefix like /opt/git, then
create symlinks from /usr/local into that hierarchy.  Uninstalling can
then be achieved by

	# rm -rf /opt/git; find /usr/local -lname '/opt/git/*' -delete

You can create a setup like that after having used one of the above
install recipes with prefix=/opt/git by writing

	# make prefix=/opt/git symlinkprefix=/usr/local install-symlinks

This works by copying the directory hierarchy of $prefix to
$symlinkprefix (not copying or descending to any directories of the
name git* matched case-insensitively), then linking all the rest.
---
 INSTALL  |   12 ++++++++++++
 Makefile |   10 +++++++++-
 2 files changed, 21 insertions(+), 1 deletions(-)

diff --git a/INSTALL b/INSTALL
index 289b046..38d6fdd 100644
--- a/INSTALL
+++ b/INSTALL
@@ -21,6 +21,18 @@ set up install paths (via config.mak.autogen), so you can write instead
 	$ make all doc ;# as yourself
 	# make install install-doc ;# as root
 
+An alternative global installation method making it much easier to
+uninstall is to use a package-specific prefix like /opt/git, then
+create symlinks from /usr/local into that hierarchy.  Uninstalling can
+then be achieved by
+
+	# rm -rf /opt/git; find /usr/local -lname '/opt/git/*' -delete
+
+You can create a setup like that after having used one of the above
+install recipes with prefix=/opt/git by writing
+
+	# make prefix=/opt/git symlinkprefix=/usr/local install-symlinks
+
 
 Issues of note:
 
diff --git a/Makefile b/Makefile
index 0055eef..caea6fb 100644
--- a/Makefile
+++ b/Makefile
@@ -147,6 +147,7 @@ ALL_LDFLAGS = $(LDFLAGS)
 STRIP ?= strip
 
 prefix = $(HOME)
+symlinkprefix = /usr/local
 bindir = $(prefix)/bin
 gitexecdir = $(bindir)
 sharedir = $(prefix)/share
@@ -727,6 +728,7 @@ bindir_SQ = $(subst ','\'',$(bindir))
 gitexecdir_SQ = $(subst ','\'',$(gitexecdir))
 template_dir_SQ = $(subst ','\'',$(template_dir))
 prefix_SQ = $(subst ','\'',$(prefix))
+symlinkprefix_SQ = $(subst ','\'',$(symlinkprefix))
 
 SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
 PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH))
@@ -1039,7 +1041,13 @@ install-info:
 quick-install-doc:
 	$(MAKE) -C Documentation quick-install
 
-
+# The somewhat strange looking lines start with an ignored $(MAKE) in
+# order to be executed also in make -n calls.
+install-symlinks:
+	@: $(MAKE) && echo cd '$(prefix_SQ)' && cd '$(prefix_SQ)' && $(FIND) . -type d ! \( -iname 'git*' -prune \) -exec echo $(INSTALL) -m 755 -d '$(symlinkprefix_SQ)/{}' \;
+	@cd '$(prefix_SQ)' && $(FIND) . -type d ! \( -iname 'git*' -prune \) -exec $(INSTALL) -m 755 -d '$(symlinkprefix_SQ)/{}' \;
+	@: $(MAKE) && echo cd '$(prefix_SQ)' && cd '$(prefix_SQ)' && $(FIND) . \( -type d -iname 'git*' -prune -o ! -type d \) -exec echo $(RM) -r '$(symlinkprefix_SQ)/{}' \; -exec echo ln -s '$(prefix_SQ)/{}' '$(symlinkprefix_SQ)/{}' \;
+	@cd '$(prefix_SQ)' && $(FIND) . \( -type d -iname 'git*' -prune -o ! -type d \) -exec $(RM) -r '$(symlinkprefix_SQ)/{}' \; -exec ln -s '$(prefix_SQ)/{}' '$(symlinkprefix_SQ)/{}' \;
 
 ### Maintainer's dist rules
 
-- 
1.5.3.1.96.g4568
Previous: in-call@gmx.netNext: Johannes Schindelin
Message 2 of 4 in “Uninstalling Git”
  1. in-call@gmx.netSep 23, 2007
  2. David KastrupSep 23, 2007
  3. Johannes SchindelinSep 23, 2007
  4. in-call@gmx.netSep 23, 2007

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.