我想做什么。
我的存储库中的所有文件都在一个文件夹中,但是此文件夹包含.gitignore
排除的其他文件。我只想根据其扩展名将这些文件仅从存储库中(以编程方式)重组(而不是忽略)而不是被忽略。
示例。。
假设我有一个文件夹/project
,其中包含:
a.py
,b.py
,c.py
,1.png
,2.png
,3.png
在哪里
-a.py
,b.py
,1.png
,2.png
在git仓库中;
-c.py
,3.png
在git仓库中不是 ,即根据.gitignore
中的规则将其忽略。
最后,我要有两个子文件夹:
-包含/project/scripts
和a.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 mv
与for
进行管道传送的问题。
文件名格式。
文件名不是特别奇异:除了扩展名(ls
,mv
)外,它们仅包含字母数字字符.py
,连字符.png
和下划线{{ 1}}。因此,将[a-zA-Z0-9]
与-
一起使用可能并不是世界末日。
答案 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/
时,则需要这样做,因为在这种情况下,它只会以错误结尾并忽略剩余文件。