git batch重命名大量已提交的文件

时间:2019-05-23 19:57:27

标签: git

我有一个git repo,其中包含成千上万个已提交的某些文件。我想使用批处理命令行命令将其重命名,例如

git mv *.txt *.md

但是收到了fatal: bad source, source=*.txt, destination=*.md消息。

如何使用git cli重命名已提交的文件?

4 个答案:

答案 0 :(得分:3)

为了获得最大的CPU效率,Git的核心update-index命令可以在stdin上进行批量更新:

git ls-files -s \*.txt \
| sed -r 's,([^ ]* )(.*)\.txt,0 \2.txt\n\1\2.md,' \
| git update-index --index-info

将一次完成索引更新。然后,您可以使用{p1}通过一次git read-tree来完成工作树更新

newtree=`git write-tree`
git read-tree @
git read-tree -u --reset @ $newtree

sed将转储的索引条目git ls -s转换为两个索引更新,旧的*.txt的删除(模式0)条目和新的{{1}的插入}一。 *.md是签出和合并以及许多其他批量工作树更新程序的核心命令,以上顺序是“为索引写一棵树,在签出时将其重置为状态,然后再读回新树并更新工作树以使其与我们进行结帐或快进合并相匹配。”


编辑:为了最大的方便,您可以

git read-tree

还将获取您在工作树中可能进行的其他任何更改;这不太安全,您可能不希望添加任何其他更改,或者您的find -name \*.txt -execdir rename .txt .md {} + git add -A . 可能还没有得到很好的调整,但是如果您的构建是干净的,这可能会节省比在make中花费更多的打字时间。 Git数字全力以赴。

答案 1 :(得分:2)

Git不支持此功能,但是您可以使用Shell的功能来执行任务:

for file in *.txt; do
  git mv "$file" "${file%.txt}.md";
done

${file%.txt}.md将展开file变量,去除其.txt扩展名,然后在其值后附加.md

答案 2 :(得分:0)

更改文件扩展名

如果您有很多带有特定文件扩展名的文件,并且想要将其更改为另一个兼容的扩展名,则可以使用以下命令:

ren *.ext1 *.ext2

命令语法示例

ren *.txt *.md

命令语法示例将文件夹中所有文件的.txt文件扩展名更改为.md格式。

重命名具有特定文件扩展名的文件

ren nyc_*.* newYork_*.*

以上命令将重命名文件夹中的所有文件。如果只想重命名扩展名为.jpg的图像文件,则可以使用以下命令:

 ren nyc_*.jpg newYork_*.jpg.

重命名多个文件

要重命名多个文件,请使用以下命令语法:

ren *.ext1 ???-new_filename_part.*

命令语法示例:

ren *.jpg ???-hikingTrip.*

答案 3 :(得分:0)

Git没有内置的“批量重命名”操作,但是没关系:您可以按自己的喜好进行批量重命名,然后git add使用新名称,git add -u选择删除(全部)旧名称,或分别git add个旧名称。那就是:

$ git mv old new

具有与以下功能完全相同的效果:

$ mv old new
$ git add old new

为了演示,我实际上已经在临时测试存储库中运行了以上两个命令,现在运行git status

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        renamed:    old -> new

knittl's answer当然可以,但是我也想展示一下我如何自己完成任务:

$ echo *.txt | sed 's/\(.*\).txt/git mv \1.txt \1.md/'
git mv a.txt b.txt a.txt b.md

糟糕,这是错误的,我每行需要一个文件名...让我们尝试一下:

$ printf %s\\n *.txt | sed 's/\(.*\).txt/git mv \1.txt \1.md/'
git mv a.txt a.md
git mv b.txt b.md

这就是我想要的,现在要实际执行,输入control-P并添加| sh

$ printf %s\\n *.txt | sed 's/\(.*\).txt/git mv \1.txt \1.md/' | sh

换句话说,我喜欢编写一个单行脚本来生成应该运行的命令,然后重新运行该单行脚本,并将输出重定向到通过管道sh输送给它们来运行它们。如果单行脚本可以帮助我解决大部分问题,但是有些情况下需要手动操作,则可以将| sh替换为> /tmp/doit.sh,然后编辑/tmp/doit.sh脚本进行手动操作。调整。

相关问题