質問

When I run git clean --dry-run the results are a bit like:

Would remove an_untracked_file
Would remove an_untracked_file_2
Would not remove some_unrelated_folder/subfolder/

The "unrelated" folders are tracked and have had no changes, so I would not expect git to remove them.

But, why does git report Would not remove for some, but not all, of my project's normal (and totally untouched) folders?

Can I tell what is causing git to consider, but then decide against, removing them?

git status lists only the couple of un-tracked files I know about. As expected.

git ls-files --other --exclude-standard returns those same un-tracked files. As expected.

git ls-files --other --exclude-standard --directory returns those same un-tracked files, plus a bunch of seemingly normal directories. This is not what I expected to see since I thought the purpose of --directory was to reduce, not increase the number of results returned.

Upon spot checking the unexpected directories, it seems each one is empty, except for a ".gitignore"d .svn sub-folder. Perhaps this factors in to things.

Can anyone help me understand this behavior?

Thank you

役に立ちましたか?

解決

By default, git clean doesn't remove folders. It's telling you that it sees an untracked folder, but it won't remove it. Give it the -d flag to instruct it to remove directories as well, as in git clean -d -n

他のヒント

Can I tell what is causing git to consider, but then decide against, removing them?

You actually can! (Since July, 2013, upcoming git 1.8.4):
"git clean" command learned an interactive mode (git clean -i).

See commit 17696002086e8c6b9e998543d212e707c7d511ab for the initial implementation:

See commit d1239264f2786d7ea15543b980c6bf6afbc4701a for the implementation:

Add a new action for interactive git-clean: filter by pattern.
When the user chooses this action, user can input space-separated patterns (the same syntax as gitignore), and each clean candidate that matches with one of the patterns will be excluded from cleaning.
When the user feels it's OK, presses ENTER and backs to the confirmation dialog.

See commit db627fd568410499c47d764937c3d7a10bbadffa for tests and examples.

See commit c0be6b4c8a1d16a92efad00d73683075cf2da60d for the documentation

Show what would be done and clean files interactively.


Interactive mode

When the command enters the interactive mode, it shows the files and directories to be cleaned, and goes into its interactive command loop.

The command loop shows the list of subcommands available, and gives a prompt "What now> ".
In general, when the prompt ends with a single '>', you can pick only one of the choices given and type return, like this:

------------
  *** Commands ***
  1: clean                2: filter by pattern    3: select by numbers
  4: ask each             5: quit                 6: help
  What now> 1
------------

You also could say c or clean above as long as the choice is unique.

The main command loop has 6 subcommands.

clean::

Start cleaning files and directories, and then quit.

filter by pattern::

This shows the files and directories to be deleted and issues an "Input ignore patterns>>" prompt.
You can input space-seperated patterns to exclude files and directories from deletion.
E.g. "*.c *.h" will excludes files end with ".c" and ".h" from deletion.
When you are satisfied with the filtered result, press ENTER (empty) back to the main menu.

select by numbers

This shows the files and directories to be deleted and issues an "Select items to delete>>" prompt.
When the prompt ends with double '>>' like this, you can make more than one selection, concatenated with whitespace or comma.
Also you can say ranges.
E.g. "2-5 7,9" to choose 2,3,4,5,7,9 from the list.
If the second number in a range is omitted, all remaining patches are taken.
E.g. "7-" to choose 7,8,9 from the list.
You can say '*' to choose everything.
Also when you are satisfied with the filtered result, press ENTER (empty) back to the main menu.

ask each::

This will start to clean, and you must confirm one by one in order to delete items.
Please note that this action is not as efficient as the above two actions.

quit::

This lets you quit without do cleaning.

help::

Show brief usage of interactive git-clean.

If certain files and folders continue to fail when executing the command, then run a

git clean -d -f

The -f would force the operation.

Use -n for a dry run.

This answer is mainly for reference purposes, as I think it's the most common scenario for cleaning up your repo dir.

To remove all untracked directories recursively:

git clean -d -f -x

-d for directories, -x for removing directories in your ignore list too (things like bin and build), which is what I need most of the time and -f to confirm you know what you're doing.

i'm using git version 2.10.0 on mac, and somehow i can not use

git clean -df

to remove the untracked files, so i used this instead:

git checkout --

PS:

if anyone can explain in the comments why i'm not able to use

git clean -df

to remove the files, i'd be very appreciative..thanks

WARNING you will also lose your tracked files :(

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top