如何在Git中删除未跟踪的文件?

196

我正在处理一个分支,称为“experimental”,它是从我的主分支中分支出来的。然后,在“experimental”分支中生成了一个用户模型,但尚未将其添加到索引中。

如果我想放弃最近在“experimental”分支中添加的所有文件更改,我该怎么做?未跟踪的文件如下所示:

$ git status
 On branch new_chick
 Untracked files:
   (use "git add <file>..." to include in what will be committed)

       .project
       app/models/user.rb
       db/migrate/
       test/fixtures/users.yml
       test/unit/user_test.rb

我尝试运行"git reset --hard",希望撤销所有更改,但上述所有文件仍然显示。

8个回答

379

要删除未跟踪的文件/目录,请执行以下操作:

git clean -fdx

-f - 强制执行

-d - 包括目录

-x - 也删除被忽略的文件(如果你不想删除被忽略的文件,就不要使用这个选项)


谨慎使用!
这些命令可以永久性地删除任意文件,这可能是你一开始没有考虑到的。请仔细检查并阅读本答案下面的所有评论和 --help 部分等,以了解所有细节来调整命令,确保获得预期的结果。


104
在预览时添加“-n”,这样您就不会意外删除内容。 - Druska
12
太好了!但是它也会删除配置文件,而你可能故意将它们列在.gitignore中以忽略它们,但仍然需要它们用于本地开发环境。你可以使用相同的命令,并加上额外的-i参数来进入交互模式,如下所示:git clean -fdxi,这样它会提示你要删除哪些文件。 - moeabdol
7
好的,你可能需要在用户须知中添加一条警告,提示他们谨慎使用“-x”,因为它会永久删除文件。或者使用@Druska提到的“-n”参数。 - lacostenycoder
3
没有使用-x参数,但是.project和其他配置文件被删除了。不得不再次从上次提交的版本中将代码仓库拉取到一个新目录中。 - timekeeper
3
我认为你需要说明这个命令可能很危险,因为它可以删除想要保留的文件! - Davide
显示剩余5条评论

46

用户互动方法:

git clean -i -fd

Remove .classpath [y/N]? N
Remove .gitignore [y/N]? N
Remove .project [y/N]? N
Remove .settings/ [y/N]? N
Remove src/com/amazon/arsdumpgenerator/inspector/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/s3/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/s3/ [y/N]? y

-i代表交互模式
-f代表强制模式
-d代表目录模式
-x代表忽略指定文件(根据需要添加)

注意:添加-n--dry-run仅检查命令会执行哪些操作。


1
如果您正在使用“-i”,那么“-f”就不再必要。 - éclairevoyant

25

删除未被跟踪的文件:

git clean -f

要同时删除未被跟踪的目录,使用:

git clean -f -d

为了避免任何心脏骤停,请使用:

git clean -n -f -d


3
-n == --dry-run, Don't actually remove anything, just show what would be done. - Ben Butterworth

19

这些是未被跟踪的文件。这意味着git没有对它们进行跟踪。只有在它们不在git忽略文件中时,才会列出这些文件。由于它们没有被git跟踪,git reset不会影响到它们。

如果你想要删除所有未被跟踪的文件,最简单的方法是使用git clean -f(如果您只想查看不删除任何内容的情况,请使用git clean -n)。否则,您可以手动删除您不想要的文件。


9

还有一种方法可以将本地仓库返回到之前的状态:

  1. 使用git add将未跟踪的文件添加到暂存区。
  2. 使用git reset --hard命令将本地仓库返回到之前的状态。

1
你的救援命令是 git clean

0

嗯,我遇到了类似的问题。我已经获取了最新版本,但由于本地文件的一些更改,合并没有发生在特定的文件上。该文件未被跟踪,而我不想要它们。

我所做的是 -

$ git checkout filepath/filename

filepath - 我执行git bash的位置。然后当我获取最新版本时,更改就可用了。


0

虽然git clean很好用,但我仍然发现使用自己的脚本来清理git repo很有用,它有一些优点。

这将显示要清理的文件列表,然后交互式提示是否清理。这几乎总是我想要的,因为对每个文件进行交互式提示变得很繁琐。

它还允许手动过滤列表,当存在不想清理的文件类型(并且有理由不提交)时,这非常方便。


git_clean.sh


#!/bin/bash
readarray -t -d '' FILES < <(
    git ls-files -z --other --directory |
        grep --null-data --null -v '.bin$\|Cargo.lock$'
)
if [ "$FILES" = "" ]; then
    echo  "Nothing to clean!"
    exit 0
fi

echo "Dirty files:"
printf '  %s\n' "${FILES[@]}"

DO_REMOVE=0
while true; do
    echo ""
    read -p "Remove ${#FILES[@]} files? [y/n]: " choice
    case "$choice" in
        y|Y )
            DO_REMOVE=1
            break ;;
        n|N )
            echo "Exiting!"
            break ;;
        * ) echo "Invalid input, expected [Y/y/N/n]"
            continue ;;
    esac
done

if [ "$DO_REMOVE" -eq 1 ];then
    echo "Removing!"
    for f in "${FILES[@]}"; do
       rm -rfv "$f"
    done
fi

Git已经具备了你的脚本提供的功能,你可以使用git clean -i命令来实现,其中的-i代表接口 - baltermia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接