当前位置: 首页 > news >正文

如何向整个 Git 仓库补提交一个文件

微软在 Reference Source 里开放了 .Net Framework 多个版本的源码。为了更方便地阅读这些源码,我们把每一个版本都下载下来后按顺序提交到 git 仓库中。

但是!!!居然忘了在第一次提交之前放一个 .gitignore 文件!如果没有这个文件,那我们每次打开源码查看都会带来一大堆不明所以的修改文件。那么多的源码,绝对不会想重新挨个版本再提交一次。于是找到了一条可以解决这个问题的 git 命令。


git filter-branch --index-filter "cp /C/仓库外面某个路径下的/.gitignore . && git add .gitignore"

执行之后,C:\仓库外面某个路径下的\.gitignore 文件就被添加到了当前分支的第一次提交里面,并且查看后面任何一次提交对应的全部文件时,都会有这个文件。

如果希望此操作对所有分支生效,则加一个 --all 参数,即:

git filter-branch --index-filter "cp /C/仓库外面某个路径下的/.gitignore . && git add .gitignore" -- --all

写这个命令时需要注意:
- git 在 Bash 里写的时候,C:\ 需要写成 /C/
- -- --all 中的 -- 是用来区分路径和提交的,官方说法是:

fatal: ambiguous argument 'cp /C/仓库外面某个路径下的/.gitignore . && git add .g
itignore': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

执行了此命令后,所有的提交其实都被重写了,提交号已经改变。如果你从未推送到远端过,那么恭喜,你已经在神不知鬼不觉中添加了一个 .gitignore 文件,就像是第一次提交就加了这个文件一样。

但是,如果此前有推送到过远程分支,请慎重!因为你的此次推送的命令和其他人首次拉取的命令将有所改变:

推送(所有分支,强制):

$ git push --all -f

拉取(获取 + 重置)

$ git fetch
$ git reset origin/master --hard

参考资料

  • GIT: How do I add a file to the first commit (and rewrite history in the process)?

相关文章:

  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • 优化 UWP 中图片的内存占用
  • UWP 中的 LaunchUriAsync,使用默认浏览器或其他应用打开链接
  • WPF/UWP 绑定中的 UpdateSourceTrigger
  • 深入了解 WPF Dispatcher 的工作原理(Invoke/InvokeAsync 部分)
  • 深入了解 WPF Dispatcher 的工作原理(PushFrame 部分)
  • DependencyProperty.UnsetValue 的正确打开方式
  • 如何组织一个同时面向 UWP/WPF/.Net Core 控制台的 C# 项目解决方案
  • 出让执行权:Task.Yield, Dispathcer.Yield
  • 如何防止后台线程抛出的异常让程序崩溃退出
  • CaptureMouse/CaptureStylus 可能会失败
  • 使用 ExceptionDispatchInfo 捕捉并重新抛出异常
  • 使用 Task.Wait()?立刻死锁(deadlock)
  • 如何实现一个可以用 await 异步等待的 Awaiter
  • WPF 同一窗口内的多线程 UI(VisualTarget)
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • IDEA常用插件整理
  • JavaScript类型识别
  • Laravel Telescope:优雅的应用调试工具
  • nodejs实现webservice问题总结
  • php面试题 汇集2
  • python学习笔记-类对象的信息
  • Python学习之路13-记分
  • react 代码优化(一) ——事件处理
  • React组件设计模式(一)
  • vue的全局变量和全局拦截请求器
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  •  一套莫尔斯电报听写、翻译系统
  • 原生js练习题---第五课
  • 选择阿里云数据库HBase版十大理由
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • #Java第九次作业--输入输出流和文件操作
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • #微信小程序:微信小程序常见的配置传值
  • $(selector).each()和$.each()的区别
  • (c语言)strcpy函数用法
  • (LeetCode 49)Anagrams
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (三)mysql_MYSQL(三)
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转载)从 Java 代码到 Java 堆
  • .Net Core与存储过程(一)
  • .Net 高效开发之不可错过的实用工具
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件
  • .NET建议使用的大小写命名原则
  • .net通用权限框架B/S (三)--MODEL层(2)
  • .NET微信公众号开发-2.0创建自定义菜单
  • @Bean有哪些属性
  • @RequestBody与@ModelAttribute