如何从当前的Git工作树中删除本地(未跟踪)文件?

8044

我该如何从当前的工作树中删除未被跟踪的本地文件?


102
这个互动的 git 命令速查表 http://www.ndpsoftware.com/git-cheatsheet.html 展示了 git 工作区(使用 "workspace" 而非 "working copy" 可以获得更好的谷歌搜索结果)。 - qneill
36
注意:如果您只想删除部分未跟踪的文件,而不是全部git clean现在有一个交互模式!请参见我对另一个问题的答案:git 1.8.4+ - VonC
在发布新答案之前,请考虑该问题已经有25个以上的答案。确保你的答案提供了现有答案中没有的信息。 - Sazzad Hissain Khan
8
为了让初学者和新手更好理解 Git,可以运行 git status 命令,如果它显示有一个文件未被跟踪,并且你不想将该文件添加到版本库中,你可以直接在文件系统中删除或移动它。这样不会对你的本地仓库或 Git 造成任何损害。你也可以使用 git clean 或以下答案中的某些变体,包括交互式版本,以仅删除选择的文件,但交互模式可能很繁琐。无论你做什么,一定要确保你理解 git clean 将删除哪些内容,或使用 --dry-run 让它告诉你而不会真正执行删除操作。 - LightCC
6
如果这些文件尚未被跟踪,你是否可以在不使用git的情况下删除它们呢?rm files-to-be-deleted - mhatch
Git现在提供交互模式,可以有选择性地删除特定的未跟踪文件,允许您选择要删除哪些文件,同时保留其他文件不受影响。 - Dmitrii Malygin
41个回答

8
oh-my-zshzsh 结合使用,通过 git 插件提供了这些很棒的别名。它们也可以在 bash 中使用。 gclean='git clean -fd'
gpristine='git reset --hard && git clean -dfx'
  • gclean 除了删除未跟踪的文件,还会删除未跟踪的目录
  • gpristine 硬重置本地更改,删除未跟踪的目录、未跟踪的文件,并且不使用从 .gitignore (每个目录) 和 $GIT_DIR/info/exclude 读取的标准忽略规则,但仍然使用带有 -e 选项给出的忽略规则。这允许删除所有未跟踪的文件,包括构建产品。这可以用于(可能与 git reset 结合使用)创建一个原始的工作目录以测试干净的构建

2
感谢您的反馈,我的陈述有些混淆。我想说的是,这些突出显示的别名是自动随 oh-my-zsh 一起提供的。它们在 bash 中显然非常有效。我编辑了我的答案以反映这一点。 - Jämes

7
git clean -f

将从当前git仓库中删除未被追踪的文件。
git clean -fd

当您想要删除目录和文件时,这将仅删除未被跟踪的目录和文件。

6

4

我喜欢使用 git stash 命令,稍后可以获取存储的文件和更改。 git clean 也是一个不错的选择,但完全取决于您的需求。以下是 git stash 和 git clean 的解释,7.3 Git 工具 - 存储和清理


3

注意:首先导航到目录并检出您要清理的分支。

-i 交互模式,它会告诉您将被删除的内容,并且您可以从列表中选择一个操作。

  1. 仅清理文件 [不会列出和清理文件夹]: $ git clean -i

  2. 清理文件和文件夹$ git clean -d -i

-d 包括目录。


如果您从列表中选择 c 。将删除未跟踪的文件/文件夹,并删除您弄乱的文件/文件夹*。

例如:如果您重新组织远程文件夹并将更改拉取到本地计算机,则最初由其他人创建的文件/文件夹将位于过去的文件夹中,并且在您重新构造的新文件夹中。


2
我曾尝试了这里最流行的答案,但是Git仍然无法从存储库中删除未跟踪的文件。不知道为什么。这是我的超级简化答案,没有特殊的Git命令!
任务:从Git存储库中删除未跟踪的文件:
  1. 将文件和文件夹暂时移动到本地项目文件夹之外
  2. 删除.gitignore中关于这些文件和文件夹的所有行以进行提交
  3. Git add .
  4. Git commit -m“清理存储库中的未跟踪文件”
  5. Git push
所有文件和文件夹都已从存储库中删除。
如果需要,我们可以在本地主机上恢复它们:
  1. 将您暂时移动到本地项目文件夹的所有文件和文件夹移回来
  2. 将与这些文件和文件夹相关的所有行移回.gitignore中
  3. Git add .
  4. Git commit -m“检查或文件不再出现在Git存储库中”
  5. Git push
完成!

2
如果其他方法都不起作用,可以使用以下组合来简单地删除“git status”命令列出的所有更改: git add -A && git commit -m temp && git reset --hard HEAD^ 这将首先暂存所有更改,然后创建一个临时提交,最后将其丢弃。

2

使用方法:git clean [-d] [-f] [-i] [-n] [-q] [-e ] [-x | -X] [--] ...

该命令用于从工作目录中删除未跟踪的文件。您可以使用不同的选项来控制要删除的文件类型以及是否要交互式地进行操作。

-q, --quiet           do not print names of files removed
-n, --dry-run         dry run
-f, --force           force
-i, --interactive     interactive cleaning
-d                    remove whole directories
-e, --exclude <pattern>
                      add <pattern> to ignore rules
-x                    remove ignored files, too
-X                    remove only ignored files

1
排除是我所需要的东西。我想清理除一个文件以外的所有内容。 - gMale

0

使用 git reset HEAD <file> 命令来取消暂存文件


0

这可以通过使用shell脚本来完成,我使用这个列出将要被删除的内容的脚本,然后让我确认操作。

这很有用,因为有时我想在清除所有内容之前检查补丁或其他文件。

#!/bin/bash
readarray -t -d '' FILES < <(git ls-files -z --other --directory)
if [ "$FILES" = "" ]; then
    echo  "Nothing to clean!"
    exit 0
fi
echo -e "Dirty files:\n"
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

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