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


110

我在一个分支上工作,比如说从我的master分支分支出来的“实验”分支。然后,我在实验分支中生成了一个用户模型,但是还没有将它们添加到索引中。

如果要舍弃最近在实验分支中添加的文件的所有更改,该怎么办?未跟踪的文件如下所示:

$ 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”,希望撤消所有这些更改,但是上面的所有文件仍然显示。

有人请向我说明一下吗?


Answers:


220

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

git clean -fdx

-f-力

-d-目录

-x-也删除被忽略的文件(如果您不想删除被忽略的文件,请不要使用此选项)


54
先添加-n预览,以免您意外删除内容
Druska 2014年

8
这很棒!除了它还会删除您可能在.gitignore中有意忽略但仍然需要本地开发环境的配置文件。您可以将以下命令与额外的-i一起用于交互模式:git clean -fdxi,它将提示您要删除的文件。
moeabdol 2015年

5
很好,但是您可能想要向用户添加一条注意以使用时要-x小心,因为它将永久删除文件。或使用-n@Druska提及的方法
lacostenycoder

3
-x仍然没有使用.project和其他配置文件被删除。必须将仓库从上一次提交再次拉入新目录。
计时器

2
我认为您必须告知该命令潜在危险,因为它可以删除想要的文件!!!
Davide

20

用户互动方式:

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仅检查其作用。


17

这些是未跟踪的文件。这意味着git没有跟踪它们。只是列出它们是因为它们不在git ignore文件中。由于它们未被git跟踪,git reset因此请勿触摸它们。

如果要删除所有未跟踪的文件,最简单的方法是git clean -fgit clean -n如果要查看它会破坏什么而没有实际删除任何内容,请使用替代方法)。否则,您可以手动删除不需要的文件。





0

好吧,我有类似的问题。我使用的是最新版本,但是本地发生了一些更改,由于这些更改未对特定文件进行合并。该文件未跟踪,我不想要它们,所以我所做的是-

$ git checkout文件路径/文件名

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.