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

时间:2011-11-20 09:30:43

标签: git

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

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

$ 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 个答案:

答案 0 :(得分:205)

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

git clean -fdx

-f - 强制

-d - 目录

-x - 也删除被忽略的文件(如果你不想删除被忽略的文件,请不要使用它)

答案 1 :(得分:16)

用户互动方式:

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 for force
-d表示目录
-x表示忽略的文件(如果需要,可添加)

注意: 添加 -n - 干运行以查看它将执行的操作。

答案 2 :(得分:15)

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

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

答案 3 :(得分:1)

救援指令是git clean

答案 4 :(得分:0)

删除未跟踪的文件:

git clean -f

要删除未跟踪的目录,请使用:

git clean -f -d

为防止任何心脏骤停,请使用

git clean -n -f -d

答案 5 :(得分:0)

好吧,我有类似的问题。我采取了最新的,但在本地有一些变化,因为合并没有发生在特定的文件。文件没有跟踪,我不想要它们  我做的是 -

$ git checkout filepath / filename

filepath - 我做git bash的位置。 然后,当我采取最新的改变是可用的

答案 6 :(得分:0)

您也可以用另一种方式返回本地仓库的先前状态:

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

答案 7 :(得分: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