如何在 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 重置—— hard”,希望能够撤消所有这些更改,但是上面的所有文件仍然显示。

有人能告诉我吗?

147366 次浏览

那些是未追踪的文件。这意味着 Git 没有追踪他们。只是因为它们不在 Git 忽略文件里才列出来的。因为他们没有被 Git 追踪,git reset不会碰他们。

如果你想删除所有未被跟踪的文件,最简单的方法是 git clean -f(如果你想看到它会删除什么而不删除任何东西,使用 git clean -n代替)。否则,您可以直接手动删除不需要的文件。

删除未跟踪的文件/目录:

git clean -fdx

- F-Force

还有目录

- 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 表示被忽略的文件(如果需要则添加) < br > < br > 注意: < em > 添加 - 是的演习来检查它将做什么。

删除未跟踪的文件:

git clean -f

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

git clean -f -d

为了防止心脏骤停,使用

git clean -n -f -d

救你的命令是 git clean

我也有过类似的问题。我采取了最新的,但有一些变化,由于在本地合并没有发生在一个特定的文件。文件没有被追踪,我不想让他们这样做 我所做的是..

$git checkout filepath/filename

Filepath-我执行 git bash 的位置。 然后,当我采取最新的变化是可用的

你也可以以另一种方式返回到本地回购协议的先前状态:

  1. 使用 git add将未跟踪的文件添加到暂存区域。
  2. 使用 git reset --hard回复到本地回购协议的先前状态。

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