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

问题描述 投票:1回答:1

我想做的事。

我的仓库中的所有文件都在一个文件夹中,但此文件夹包含.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可能不是世界末日。

git pipe mv
1个回答
2
投票

假设您的文件现在位于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/),因为在这种情况下它只会以错误结束并省略剩余文件。

© www.soinside.com 2019 - 2024. All rights reserved.