[PATCH] Add git-clean command

Subsystems: documentation, kernel build + files below scripts/ (unless maintained elsewhere), the rest

DORMANTno replies

4 messages, 3 authors, 2016-06-15 · open the first message on its own page

[PATCH] Add git-clean command

From: Pavel Roskin <hidden>
Date: 2016-06-15 22:42:23

This command removes untracked files from the working tree.  This
implementation is based on cg-clean with some simplifications.  The
documentation is included.

Signed-off-by: Pavel Roskin <redacted>
---

 .gitignore                  |    1 +
 Documentation/git-clean.txt |   50 +++++++++++++++++++++++++++++++
 Makefile                    |    2 +
 git-clean.sh                |   70 +++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 122 insertions(+), 1 deletions(-)
diff --git a/.gitignore b/.gitignore
index 75891c3..b5959d6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,6 +15,7 @@ git-checkout
 git-checkout-index
 git-cherry
 git-cherry-pick
+git-clean
 git-clone
 git-clone-pack
 git-commit
diff --git a/Documentation/git-clean.txt b/Documentation/git-clean.txt
new file mode 100644
index 0000000..0c671e1
--- /dev/null
+++ b/Documentation/git-clean.txt
@@ -0,0 +1,50 @@
+git-clean(1)
+============
+
+NAME
+----
+git-clean - Remove untracked files from the working tree
+
+SYNOPSIS
+--------
+[verse]
+'git-clean' [-d | -D] [-n] [-q] [-x]
+
+DESCRIPTION
+-----------
+Removes files unknown to git.  This allows to clean the working tree
+from files that are not under version control.  If the '-x' option is
+specified, ignored files are also removed, allowing to remove all
+build products.
+
+OPTIONS
+-------
+-d::
+	Remove untracked directories in addition to untracked files.
+
+-D::
+	Same as above, but use chmod first.  This is useful for
+	read-only directories used in some testsuites.
+
+-n::
+	Don't actually remove anything, just show what would be done.
+
+-q::
+	Be quiet, only report errors, but not the files that are
+	successfully removed.
+
+-x::
+	Don't use the ignore rules.  This allows removing all untracked
+	files, including build products.  This can be used (possibly in
+	conjunction with gitlink:git-reset[1]) to create a pristine
+	working directory to test a clean build.
+
+
+Author
+------
+Written by Pavel Roskin <proski@gnu.org>
+
+
+GIT
+---
+Part of the gitlink:git[7] suite
diff --git a/Makefile b/Makefile
index c79d646..221e59a 100644
--- a/Makefile
+++ b/Makefile
@@ -114,7 +114,7 @@ ### --- END CONFIGURATION SECTION ---
 
 SCRIPT_SH = \
 	git-add.sh git-bisect.sh git-branch.sh git-checkout.sh \
-	git-cherry.sh git-clone.sh git-commit.sh \
+	git-cherry.sh git-clean.sh git-clone.sh git-commit.sh \
 	git-count-objects.sh git-diff.sh git-fetch.sh \
 	git-format-patch.sh git-log.sh git-ls-remote.sh \
 	git-merge-one-file.sh git-parse-remote.sh \
diff --git a/git-clean.sh b/git-clean.sh
new file mode 100755
index 0000000..8470559
--- /dev/null
+++ b/git-clean.sh
@@ -0,0 +1,70 @@
+#!/bin/sh
+#
+# Copyright (c) 2005-2006 Pavel Roskin
+#
+
+USAGE="[-d | -D] [-n] [-q] [-x]"
+LONG_USAGE='Clean untracked files from the working directory
+	-d	remove directories as well
+	-D	remove directories, try harder (chmod first)
+	-n 	don'\''t remove anything, just show what would be done
+	-q	be quiet, only report errors
+	-x	remove ignored files as well'
+SUBDIRECTORY_OK=Yes
+. git-sh-setup
+
+noexclude=
+cleandir=
+cleandirhard=
+quiet=
+rmf="rm -f"
+rmrf="rm -rf"
+rm_refuse="echo Not removing"
+echo1="echo"
+
+for arg in "$@"; do
+	if [ "$arg" = "-d" ]; then
+		cleandir=1
+	elif [ "$arg" = "-D" ]; then
+		cleandir=1
+		cleandirhard=1
+	elif [ "$arg" = "-n" ]; then
+		quiet=1
+		rmf="echo Would remove"
+		rmrf="echo Would remove"
+		rm_refuse="echo Would not remove"
+		echo1=":"
+	elif [ "$arg" = "-q" ]; then
+		quiet=1
+	elif [ "$arg" = "-x" ]; then
+		noexclude=1
+	else
+		echo >&2 "Unknown option: \"$arg\""
+		exit 1
+	fi
+done
+
+excl1=
+excl2=
+if [ -z "$noexclude" ]; then
+	excl1="--exclude-per-directory=.gitignore"
+	if [ -f "$GIT_DIR/info/exclude" ]; then
+		excl2="--exclude-from=$GIT_DIR/info/exclude"
+	fi
+fi
+
+git-ls-files --others --directory "$excl1" "$excl2" |
+while read -r file; do
+	if [ -d "$file" -a ! -L "$file" ]; then
+		if [ -z "$cleandir" ]; then
+			$rm_refuse "$file"
+			continue
+		fi
+		$echo1 "Removing $file"
+		[ "$cleandirhard" ] && chmod -R 700 "$file"
+		$rmrf "$file"
+	else
+		$echo1 "Removing $file"
+		$rmf "$file"
+	fi
+done

Re: [PATCH] Add git-clean command

From: Martin Waitz <hidden>
Date: 2016-06-15 22:42:23

hoi :)
+-x::
+	Don't use the ignore rules.  This allows removing all untracked
+	files, including build products.  This can be used (possibly in
+	conjunction with gitlink:git-reset[1]) to create a pristine
+	working directory to test a clean build.
as ignored files are generally generated files, doesn't it make sense
to clean up the "ignored" files, and leave other untracked files
alone?  That way you don't loose files which you forgot to add to git.

What is the use case of cleaning up all untracked files without also
cleaning ignored files?

-- 
Martin Waitz

Re: [PATCH] Add git-clean command

From: Alex Riesen <hidden>
Date: 2016-06-15 22:42:23

On 4/4/06, Martin Waitz [off-list ref] wrote:
What is the use case of cleaning up all untracked files without also
cleaning ignored files?
Thinks of git's .gitignore: it has config.mak in it. Are you sure you want
"clean" your build customizations?

Re: [PATCH] Add git-clean command

From: Pavel Roskin <hidden>
Date: 2016-06-15 22:42:23

On Tue, 2006-04-04 at 11:17 +0200, Alex Riesen wrote:
On 4/4/06, Martin Waitz [off-list ref] wrote:
quoted
What is the use case of cleaning up all untracked files without also
cleaning ignored files?
Thinks of git's .gitignore: it has config.mak in it. Are you sure you want
"clean" your build customizations?
In may case, I normally want to remove copies of the sources.  For
example, I take foo.c, make a clean copy of it, then I change and test
it.  If if doesn't work and I want to try another approach, I copy it to
foo.c-bad or foo.c-approach1.  I also make diffs between files to see
what exactly I changed.  I may also create files for output, valgrind
logs and so on.

At some point, I'm satisfied with foo.c, so I commit it.  Then I want to
remove copies, diffs and other stuff.  Yet I don't want to rebuild
everything.

It's very rare that I add a new file, and I always remember to add it to
the version control.  But I'll consider adding an option to only remove
ignored files.

-- 
Regards,
Pavel Roskin
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help