Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git rm有几个文件?_Git_Git Rm - Fatal编程技术网

Git rm有几个文件?

Git rm有几个文件?,git,git-rm,Git,Git Rm,如何在不手动键入所有文件到git rm的完整路径的情况下轻松删除多个文件?我有很多修改过的文件,我想保留,所以删除所有修改过的文件也是不可能的 此外,还可以恢复多个文件的更改,而无需手动键入git checkout--/path/to/file?在POSIX系统上,您可以创建一个与所有所需文件匹配的shell glob,您只需将其传递到git rm和git checkout--。在Windows上,cmd.exe和PowerShell不包括globbing和farm到应用程序(据我所知,git不

如何在不手动键入所有文件到
git rm
的完整路径的情况下轻松删除多个文件?我有很多修改过的文件,我想保留,所以删除所有修改过的文件也是不可能的


此外,还可以恢复多个文件的更改,而无需手动键入
git checkout--/path/to/file

在POSIX系统上,您可以创建一个与所有所需文件匹配的shell glob,您只需将其传递到
git rm
git checkout--
。在Windows上,cmd.exe和PowerShell不包括globbing和farm到应用程序(据我所知,git不会对文件执行此操作)。您需要使用Windows命令或脚本来准备文件列表,并将其适当地传输到git命令以获得类似的效果


任何将文件列表传递给shell命令的策略都适用于接受文件路径的git命令。

只需使用任何其他方法(资源管理器等)删除它们,然后运行
git add-a
。至于恢复多个文件,您还可以签出一个目录

您可以为
git rm
提供通配符

e、 g

或者,您可以将所有文件的名称写在另一个文件中,例如
filesToRemove.txt

path/to/file.c
path/to/another/file2.c
path/to/some/other/file3.c
您可以自动执行此操作:

find . -name '*.c' > filesToRemove.txt
打开文件并查看名称(以确保其正确)

然后:

或:


查看手册页中的
xargs
了解更多选项(特别是如果文件太多)。

您也可以查看,因为它在Windows上提供了许多Unix/Linux/*BSD功能。Cygwin包括一个bashshell和find(1),以及上面提到的其他工具。(我通常在Windows 7上一次安装2-4个Cygwin mintty终端,因为我发现Cygwin非常方便。)

要同时删除多个文件,您可能需要签出答案

您可以删除不需要的文件并运行以下命令:
git rm$(git ls files--deleted)

您只需使用:

git add -u
从官方

-u --更新

仅在索引已具有匹配项的位置更新索引 . 这将删除和修改索引项以匹配 工作树,但不添加新文件

如果使用-u选项时给出“否”,则所有跟踪的文件都将显示在 整个工作树都被更新了(Git的旧版本用于限制 对当前目录及其子目录的更新)

换言之

它将更新或删除整个工作树中以前跟踪的文件。它不会添加新文件


我发现git rm对通配符的处理很烦人。“查找”可以在一行中完成此操作:

找到-名称'*.c'-exec git rm{}\;

{}
是替换文件名的地方。
find
的好处在于它可以过滤大量文件属性,而不仅仅是名称。

在Windows 10上,使用Git Bash,从文件结构中的
.gitignore
位置进行过滤

git rm -r --cached some_directory/
我只是用它来递归地忽略整个目录。 这是我的
.gitignore
文件中的内容:

# Use .gitignore to ignore a directory and its contents #
/some_directory/ 
您只需使用

find . -name '*.DS_Store' | xargs git rm
要删除许多与通配符匹配的文件

或者,您可以将所有文件的名称写在另一个文件中,比如
filesToRemove.txt

对于Git 2.26(2020年第2季度),这是一个很好的方法,因为“
Git rm
”和“
Git stash
”学习了新的“
--pathspec from file
”选项

因此,在cat filesToRemove.txt
中不再为i添加
;do git rm$i;完成

一个简单的
git rm--pathspec from file=filesToRemove.txt
就足够了

参见,、、(2020年2月17日)和(2020年1月16日)的作者。
(于2020年3月9日合并)

:支持--pathspec from file选项 签字人:Alexandr Miloslavskiy

为简便起见作出的决定:

不允许在参数和文件中同时传递pathspec

如果(!argc)
块:

此代码实际上表示“pathspec不存在”。
以前,pathspec只能来自命令行参数,因此测试
argc
是测试pathspec是否存在的有效方法。但对于
——文件中的pathspec
,情况不再如此

在整个
--pathspec from file
故事中,我试图让它的行为非常接近于在命令行上给出pathspec,这样从一个切换到另一个就不会有任何意外

然而,在文件中为空的
--pathspec的情况下向用户抛出用法会让人感到困惑,因为“用法”(即argc/argv数组)没有任何错误

另一方面,在旧的情况下抛出用法对我来说也很糟糕。虽然这不是一个难题,但我(作为用户)从不喜欢将我的命令行与“用法”进行比较,试图找出不同之处。因为已经知道错误是什么,所以将特定错误告知用户感觉好多了

从commit(“
git rm
:honor
-n
flag”2006-06-09,git v1.4.0)判断,在这种情况下显示用法似乎并不重要(该补丁是为了避免segfault),并且它不适合其他命令对空pathspec的反应(例如,请参阅带有自定义消息的
git add

因此,我决定在这两种情况下都显示新的错误文本。
为了尽早继续测试错误,我将
parse_pathspec()
移到了更高的位置。现在它发生在
read\u cache()
/
hold\u locked\u index()
/
setup\u work\u tree()
之前,这应该不会导致任何问题

简易方法:

  • 在文件资源管理器中删除文件
  • 使用
    git ls文件--deleted | xargs git add
    将其暂存。一旦按下按钮,它们将在遥控器中移除
Git方式: 引用什么@C
git rm -r --cached some_directory/
# Use .gitignore to ignore a directory and its contents #
/some_directory/ 
find . -name '*.DS_Store' | xargs git rm