【问题标题】:Git apply a change to all files in all previous commitsGit 将更改应用于所有先前提交中的所有文件
【发布时间】:2020-07-05 15:56:24
【问题描述】:

我想对我的 git 历史记录中的所有文件应用更改。更准确地说,我想修改一个特定的行,即作者姓名(它写在我所有文件的标题中,我不是在谈论 git 作者)以从所有 git 历史记录中删除以前的值并更改它由新的。
到目前为止,我已经尝试使用git filter-branch 来执行以下命令: sed -i -e "s/<previous_author>/<new_author>/" 当我在单个文件上尝试时完美运行( 确实被文件中的 替换)。
但是,当我使用git filter-branch -f --tree-filter 'sed -i -e "s/<previous_author>/<new_author>/"' HEAD 时,我收到错误sed: -i may not be used with stdin。我试图用git rebase 做类似的事情,但我得到了同样的错误。
那么有没有办法做到这一点,所以对我之前所有提交的所有文件执行 sed -i -e "s/<previous_author>/<new_author>/" ?提前致谢。

【问题讨论】:

  • 您需要编写一个实际作用于每个文件的过滤器。您的 sed 命令没问题,它只需要一个包装器,类似于“一次查找每个文件,在找到的文件上运行 sed,报告成功”。某些版本的 sed 可以采用多个文件参数 - 如果您有其中之一,请考虑使用 findxargs 来减少 sed 调用的数量。

标签: git sed git-rewrite-history


【解决方案1】:

你可以试试

git filter-branch -f --tree-filter \
'if git grep --name-only "@author";  
 then
    git grep --name-only "@author" | xargs sed -i -e "s/@prev_auth/@new_author/"
 fi'

【讨论】:

  • 谢谢,效果很好!但是,在使用它之后,我得到了我所有文件的副本,其中 -e 的名称(例如 myFile.txt 被修改但我得到一个新文件 myFile.txt-e 它是初始文件的副本),你有关于如何删除它们/如何防止这种情况发生的任何想法?
  • 我很高兴这有帮助:) 你能分享你使用的命令吗?作为输出,这听起来很奇怪
  • 我使用的正是你的命令:git filter-branch -f --tree-filter \ 'if git grep --name-only "@prev_auth"; then git grep --name-only "@prev_auth" | xargs sed -i -e "s/@prev_auth/@new_author/" fi'。我准确地说这些文件存在于我的 git 历史记录中的所有提交中。
  • 这些文件末尾附加-e 是否被git跟踪?如果没有,您可以删除它们。
  • @Seth:-e 文件正在发生,因为您的特定sed-i -e 解释为:通过将-e 添加到文件名来制作备份文件 .不同的sed 命令对-i 参数的处理方式不同;你的需要-i ''
猜你喜欢
  • 1970-01-01
  • 2011-06-02
  • 2012-10-13
  • 2019-03-08
  • 2018-07-02
  • 2016-03-01
  • 2011-07-13
  • 2011-03-09
相关资源
最近更新 更多