繁体   English   中英

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

[英]how to remove untracked files in 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”以撤消所有这些更改,但上面的所有文件仍然显示。

任何人请对我有所了解?

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

git clean -fdx

-f - 力

-d - 也是目录

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


谨慎使用!
这些命令可以永久删除您最初没有想到的任意文件。 请仔细检查并阅读此答案下方的所有评论和 --help 部分等,以便了解所有详细信息以微调您的命令并确保获得预期结果。

用户交互方式:

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来检查它会做什么。

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

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

删除未跟踪的文件:

git clean -f

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

git clean -f -d

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

git clean -n -f -d

您还可以通过另一种方式返回本地 repo 的先前状态:

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

您的救援命令是git clean

嗯,我有类似的问题。 我采取了最新的但由于合并没有发生在特定文件上,所以本地发生了一些变化。 该文件未被跟踪,我不想要它们,所以我所做的是-

$ git checkout 文件路径/文件名

文件路径 - 我执行 git bash 的位置。 然后当我采用最新的更改时

虽然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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM