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

时间:2019-04-24 09:43:28

标签: git pipe mv

我想做什么

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

示例。

假设我有一个文件夹/project,其中包含:
a.pyb.pyc.py1.png2.png3.png
在哪里
-a.pyb.py1.png2.png在git仓库中;
-c.py3.png在git仓库中不是 ,即根据.gitignore中的规则将其忽略。

最后,我要有两个子文件夹:
-包含/project/scriptsa.py的{​​{1}};
-包含b.py/project/images的{​​{1}};

-1.png仍包含2.png/project

一些想法

我阅读了c.py命令的文档,但没有看到可以直接从3.png命令过滤文件。

一个想法是使用git mv从仓库中列出那些文件,然后通过管道将其传输到git mv。但是我怀疑这是as bad as piping ls and mv

作为最后的选择,我可以使用git ls-files循环,但是我敢肯定有人会更好。实际上,我不确定这是否会避免将git mvfor进行管道传送的问题。

文件名格式

文件名不是特别奇异:除了扩展名(lsmv)外,它们仅包含字母数字字符.py,连字符.png和下划线{{ 1}}。因此,将[a-zA-Z0-9]-一起使用可能并不是世界末日。

1 个答案:

答案 0 :(得分: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/时,则需要这样做,因为在这种情况下,它只会以错误结尾并忽略剩余文件。