1#!/bin/sh
2#
3# Copyright (c) 2005-2006 Pavel Roskin
4#
5
6OPTIONS_KEEPDASHDASH=
7OPTIONS_SPEC="\
8git-clean [options] <paths>...
9
10Clean untracked files from the working directory
11
12When optional <paths>... arguments are given, the paths
13affected are further limited to those that match them.
14--
15d remove directories as well
16f override clean.requireForce and clean anyway
17n don't remove anything, just show what would be done
18q be quiet, only report errors
19x remove ignored files as well
20X remove only ignored files"
21
22SUBDIRECTORY_OK=Yes
23. git-sh-setup
24require_work_tree
25
26ignored=
27ignoredonly=
28cleandir=
29disabled="`git config --bool clean.requireForce`"
30rmf="rm -f --"
31rmrf="rm -rf --"
32rm_refuse="echo Not removing"
33echo1="echo"
34
35while test $# != 0
36do
37 case "$1" in
38 -d)
39 cleandir=1
40 ;;
41 -f)
42 disabled=
43 ;;
44 -n)
45 disabled=
46 rmf="echo Would remove"
47 rmrf="echo Would remove"
48 rm_refuse="echo Would not remove"
49 echo1=":"
50 ;;
51 -q)
52 echo1=":"
53 ;;
54 -x)
55 ignored=1
56 ;;
57 -X)
58 ignoredonly=1
59 ;;
60 --)
61 shift
62 break
63 ;;
64 *)
65 usage # should not happen
66 ;;
67 esac
68 shift
69done
70
71if [ "$disabled" = true ]; then
72 die "clean.requireForce set and -n or -f not given; refusing to clean"
73fi
74
75if [ "$ignored,$ignoredonly" = "1,1" ]; then
76 die "-x and -X cannot be set together"
77fi
78
79if [ -z "$ignored" ]; then
80 excl="--exclude-per-directory=.gitignore"
81 if [ -f "$GIT_DIR/info/exclude" ]; then
82 excl_info="--exclude-from=$GIT_DIR/info/exclude"
83 fi
84 if [ "$ignoredonly" ]; then
85 excl="$excl --ignored"
86 fi
87fi
88
89git ls-files --others --directory $excl ${excl_info:+"$excl_info"} -- "$@" |
90while read -r file; do
91 if [ -d "$file" -a ! -L "$file" ]; then
92 if [ -z "$cleandir" ]; then
93 $rm_refuse "$file"
94 continue
95 fi
96 $echo1 "Removing $file"
97 $rmrf "$file"
98 else
99 $echo1 "Removing $file"
100 $rmf "$file"
101 fi
102done