是否使用Linux命令删除除.git文件夹以外的所有文件?
在将新文件复制到分支之前,我想删除当前目录中除是否使用Linux命令删除除.git文件夹以外的所有文件?,linux,git,Linux,Git,在将新文件复制到分支之前,我想删除当前目录中除.git/文件夹之外的所有内容 linux命令的作用是什么?一种方法是使用rm-rf*,它将从文件夹中删除除点文件和点文件夹(如.git)以外的所有文件。然后,您可以逐个删除点文件和点文件夹,这样您就不会错过重要的点文件,如以后的.gitignore,.gittributes 另一种方法是将.git文件夹移出目录,然后返回并删除文件夹中的所有内容,并将.git文件夹移回 mv .git/ ../ cd .. rm -rf folder/* mv .g
.git/
文件夹之外的所有内容
linux命令的作用是什么?一种方法是使用
rm-rf*
,它将从文件夹中删除除点文件和点文件夹(如.git
)以外的所有文件。然后,您可以逐个删除点文件和点文件夹,这样您就不会错过重要的点文件,如以后的.gitignore
,.gittributes
另一种方法是将.git
文件夹移出目录,然后返回并删除文件夹中的所有内容,并将.git
文件夹移回
mv .git/ ../
cd ..
rm -rf folder/*
mv .git/ folder/
cd folder
末尾的附加
rm
将删除特殊的.gitignore
。如果您确实需要该文件,请将其取下。正如Crayon在评论中提到的,简单的解决方案是将.git移出目录,删除所有内容,然后将其移回。但是,如果你想以一种奇特的方式来完成这项工作,find
已经为你提供了支持:
find -not -path "./.git/*" -not -name ".git" | grep git
find -not -path "./.git/*" -not -name ".git" -delete
我放在那里的第一行是因为使用find
,在运行-delete
之前,我总是想再次检查以确保它找到了我认为的内容
编辑:有一个头脑呆滞的时刻,不只是从我的终端复制
Edit2:添加了-not-name.git“
,这可以防止它尝试删除.git
目录,并抑制错误。根据find
尝试删除内容的顺序,它可能会在非空目录上失败。应该找到所有名为.git的文件和目录
应该找到所有未命名为.git的文件和目录
删除找到的所有文件
确保发现的内容符合您的要求
如果要删除目录,请将rm命令更改为rm-rvf
我包括v
选项以查看已删除的文件
如果您想在删除文件之前确定这些文件
通过管道将find命令传输到一个文件,并使用find和prune选项查看结果
find . -path ./.git -prune -o -exec rm -rf {} \; 2> /dev/null
编辑:用于两个目录
.git
和dist
find . -path ./.git -prune -o \( \! -path ./dist \) -exec rm -rf {} \; 2> /dev/null
重置指数成本很低,因此
git rm -rf .
git clean -fxd
然后你可以重置索引(使用git reset),或者直接去检查一个新的分支。在大多数情况下,我只需要
rm-rf*
,它将跳过所有的点文件,然后根据需要手动管理任何剩余部分。您可以使用find
,但也可以只使用ls-A>/tmp/doit
,然后将/tmp/doit
编辑到rm或rm-r,除了.git
之外的所有内容,这通常更容易。或者只需将.git
移动到一个diff临时文件夹,然后删除所有内容,然后将其移回。如果在克隆后立即需要此操作,则只需使用-n
(--无签出
)进行克隆即可选项:git clone-n-b
-1用户希望删除除.git
文件以外的所有文件,而这些文件与您似乎要删除的文件相同。@mu無 他们使用了grep-v,这将使比赛逆转。但是,当有更好的选项时,这仍然是一个非常尴尬的解决方案。@cincodenada另一个问题是,这不会删除文件夹中剩余的点文件。另外,最初代码中出现了一些错误,现在已经纠正了,这给了我-bash:意外标记附近的语法错误
|'`@TimWolla你是对的,但是如果这些特殊字符不能/没有在文件名中使用,生活会更好运行find-not-name.git | grep git
-您将看到您正在尝试删除.git
目录中的所有文件,因为它们的文件名中没有“.git”。您正在查找-path和一些通配符。这就是为什么我发出的删除文件的命令前面有“-not”。我将回顾我的答案。我最初的评论有一个打字错误,我省略了-不,我已经改正了。请参阅我更正的评论,了解您为什么需要了解有关find
命令如何工作的更多信息。是的,幸运的是,这是一个git repo,我可以在测试后重新克隆。它不会删除任何文件夹。虽然它可以工作,但它会给我错误提示,find:'./scss::没有这样的文件或目录
,但仍然会删除所有内容。古怪的pxl,如果你能抑制我所遇到的错误,我将选择没有这样的文件或目录
。@EricSteinborn:将stderr重定向添加到空文件我知道这是一个与初始问题不同的问题,但是你如何添加另一个被忽略的文件夹?说“dist/”和“.git”?这需要运行第一行吗?回答了我自己的问题,没有。所以这很好,我觉得没有引用的版本被更广泛地接受为正确答案。这和被接受的答案之间的主要区别不是引用(我有那些可以防止试图过早扩展全局的shell的引用),但是-prune
。这是完成同一任务的另一种方式。至于第一行:无论何时运行find-delete
,您都应该首先在不使用-delete
的情况下运行它,以确保您没有做意外的事情。回答得好。用-path“*/.git/*”
替换-path“*/.git/*”
时,它可以排除位于一个公共目录下的多个git存储库。就像projects/project1/.git
和projects/project2/.git
一样,这可以直接在projects/
目录中运行。很好!这是一个很好的git特定解决方案,我不知道,在这种情况下,这可能是一个更好的解决方案。这应该是选择的答案应该肯定是选择的答案来重置索引,无论是git reset
还是git checkout
都不适合我。我必须使用git reset--h
find . -not -name .git -exec rm -vf {} \;
find . -path ./.git -prune -o -exec rm -rf {} \; 2> /dev/null
find . -path ./.git -prune -o \( \! -path ./dist \) -exec rm -rf {} \; 2> /dev/null
git rm -rf .
git clean -fxd