根据扩展名将git repo文件移动到子文件夹
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了根据扩展名将git repo文件移动到子文件夹相关的知识,希望对你有一定的参考价值。
我想做的事。
我的仓库中的所有文件都在一个文件夹中,但此文件夹包含.gitignore
排除的其他文件。我想根据扩展名(仅以编程方式)将这些文件从repo(而不是那些被忽略的)重新组织到不同的文件夹中。
例..
假设我有一个文件夹/project
:
a.py
,b.py
,c.py
,1.png
,2.png
,3.png
哪里
- a.py
,b.py
,1.png
,2.png
都在git repo中;
- c.py
,3.png
不在git repo中,即根据.gitignore
中的规则被忽略。
最后我想要两个子文件夹:
- 包含/project/scripts
和a.py
的b.py
;
- 包含/project/images
和1.png
的2.png
;
而
- /project
仍然包含c.py
和3.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批处理,根据清单中的文件名将多个文件移动到另外一个路径下,如何批量处理?非常感谢!