git批量重命名提交的文件

b0zn9rqh  于 2023-08-01  发布在  Git
关注(0)|答案(5)|浏览(125)

我有一个git repo,其中包含大量(数千)提交的文件。我想用批处理命令行命令重命名它,类似于

git mv *.txt *.md

字符串
但是收到了fatal: bad source, source=*.txt, destination=*.md消息。
如何使用git cli重命名提交的文件?

mgdq6dx1

mgdq6dx11#

Git不支持这种开箱即用的方式,但是你可以使用shell的特性来执行这个任务:

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

字符串
${file%.txt}.md将展开file变量,去掉其.txt扩展,然后在其值后追加.md

enxuqcxy

enxuqcxy2#

为了获得最大的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

字符串
其将在一次通过中完成索引更新。然后,您可以让git read-tree在一次传递中完成您的工作树更新

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


sed将转储的索引条目git ls -s转换为两个索引更新,一个删除(模式0)条目用于旧的*.txt名称,一个插入条目用于新的*.md名称。git read-tree是checkout和merge以及许多其他批量工作树更新器的核心命令,上面的顺序是“为索引写一个树,将其重置为checkout时的状态,然后读取新树并更新工作树以匹配,就像我们正在执行checkout或快进合并一样”。
编辑:为了最大的方便,你可以改为

find -name \*.txt -execdir rename .txt .md {} +
git add -A .


这也将拾取您在工作树中可能具有的任何其他更改;这是不太“安全”的,你可能不想添加任何其他的更改,或者你的.gitignore可能还没有调好,但是如果你的构建是干净的,这可能会保存更多的输入时间,而不是花费在make-Git-figure-it-all-out上的时间。

blmhpbnm

blmhpbnm3#

更改文件扩展名

如果您有很多具有特定文件扩展名的文件,并且您希望将其更改为其他兼容的扩展名,则可以使用以下命令:

ren *.ext1 *.ext2

字符串
命令语法示例

ren *.txt *.md


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

使用特定文件扩展名重命名文件

第一个月
上面的命令将重命名文件夹中的所有文件。如果要仅重命名扩展名为.jpg的图像文件,可以使用以下命令:

ren nyc_*.jpg newYork_*.jpg.

重命名多个文件

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

ren *.ext1 ???-new_filename_part.*


命令语法示例:

ren *.jpg ???-hikingTrip.*

vsmadaxz

vsmadaxz4#

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脚本来进行手动调整。

t1qtbnec

t1qtbnec5#

在Windows10上,Git Bash,我工作如下,以便将扩展名.css更改为.scss

find . -name "*.css" -exec sh -c 'git mv "$1" "${1%.css}.scss"' _ {} \;

字符串

相关问题