根据扩展名将git repo文件移动到子文件夹

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了根据扩展名将git repo文件移动到子文件夹相关的知识,希望对你有一定的参考价值。

我想做的事。

我的仓库中的所有文件都在一个文件夹中,但此文件夹包含.gitignore排除的其他文件。我想根据扩展名(仅以编程方式)将这些文件从repo(而不是那些被忽略的)重新组织到不同的文件夹中。

例..

假设我有一个文件夹/projecta.pyb.pyc.py1.png2.png3.png 哪里 - a.pyb.py1.png2.png都在git repo中; - c.py3.png不在git repo中,即根据.gitignore中的规则被忽略。

最后我想要两个子文件夹: - 包含/project/scriptsa.pyb.py; - 包含/project/images1.png2.png; 而 - /project仍然包含c.py3.png

一些想法。

我阅读了git mv命令的文档,但我没有看到我可以直接从git mv命令过滤文件。

一个想法是使用git ls-files从repo列出这些文件,然后将其传递给git mv。但我怀疑这是as bad as piping ls and mv

作为最后的手段,我可​​以使用for循环,但我相信那里的人知道更好。事实上,我不确定这会避免与ls管道mv的问题。

文件名的格式。

文件名不是特别奇特:除了它们的扩展名(.py.png),它们只包含字母数字字符[a-zA-Z0-9],连字符-和下划线_。所以用git ls-files管道git mv可能不是世界末日。

答案

假设您的文件现在位于project目录中,并且您希望仅将跟踪的文件移动到您可以使用的不同目录

mkdir scripts images
find project/ -name "*.py" -exec git mv -k {} scripts/ ;
find project/ -name "*.png" -exec git mv -k {} images/ ;
git commit

您将找到与特定模式匹配的所有文件。然后你将移动这些文件,但只有当它们被git跟踪到指定的文件夹时。否则,git mv命令将跳过这些文件(例如,因为它们被.gitignore忽略)。

从git mv手册页:

   -k
       Skip move or rename actions which would lead to an error condition.
       An error happens when a source is neither existing nor controlled by Git, or
       when it would overwrite an existing file unless -f is given.

实际上你可以省略-k选项,因为正在为找到的每个文件执行git mv命令。它只会打印一条错误消息并继续使用其余文件。另一方面,当一次为多个文件执行git mv时需要它(例如git mv project/* new_folder/),因为在这种情况下它只会以错误结束并省略剩余文件。

以上是关于根据扩展名将git repo文件移动到子文件夹的主要内容,如果未能解决你的问题,请参考以下文章

bat批处理,根据清单中的文件名将多个文件移动到另外一个路径下,如何批量处理?非常感谢!

将Git存储库移动到子文件夹

使用SSIS表达式任务和文件系统任务,根据文件名将文件从一个文件夹移动到多个文件夹

批处理文件根据文件名将文件复制到多个文件夹

将旧文件移动到子文件夹中

根据txt中的文件名将文件复制到目标文件夹中