问个 Git 基操:怎么样复制一个文件,能保持历史记录?

123 天前
 xiangyuecn
git cp:没这号命令😂
git mv:这是改名

比如已有 a.txt ,我现在要个 b.txt 。 如何复制出 b.txt 这个文件,并且复制前的历史和 a.txt 保持一致?

还是说 和空文件夹 一样,git 不在乎你死活?

操作尽量简单,要是涉及的非基础知识点太多,还是算了,这历史不要也罢😂

8032 次点击
所在节点    git
99 条回复
skankhunt42
123 天前
没明白你的需求
benjim
123 天前
你这需求就很妖
way2create
123 天前
什么应用场景这是,我只试过批量修改提交历史的用户名邮箱,因为搞错了
xiangyuecn
123 天前
@skankhunt42 @cookygg
场景一:a.txt 里面有 500 行代码,现在有个新功能 b.txt ,和 a.txt 功能完全一致,就只用改某一行的几个字

场景二:a.txt 里面有 2000 行代码,现在要把里面后半部分 1000 行拆分到 b.txt 里,拆分出来的代码新文件要有原来的历史记录
darklinden
123 天前
我这儿有过需求是 mono repo 中两个子项目共用一个配置
解决方式是单独提出来到最外层,然后如果需要放到子项目内就在文件夹内丢硬链接
pagxir
123 天前
你确实这是用 git 来做版本管理的么,你确定不是想建立一个分支啥的。非要 copy 的话,你可以考虑用 SVN 。
BrowerDriver
123 天前
Iakihsoug
123 天前
啊这 不知道 OP 听没听说过继承重写
magggia
123 天前
没戏,跟 git 自身的原理相悖了,不支持
mercury233
123 天前
假如 a 文件涉及 100 个 commit ,你这新建 b 文件的同时也得新建 100 个 commit ,不能去修改历史记录,我猜 git 自身没有这个功能
unused
123 天前
filter-branch 每个 commit 复制一遍
whoosy
123 天前
git 本事就是保持和维护 commit 历史记录的,你这直接伪造可还行
xiangyuecn
123 天前
@BrowerDriver @Iakihsoug
有没有基础可以用的操作,太复杂的不是说不可以学,要用的时候肯得去翻文档,时间成本太高了,前提是知道翻什么地方,不常用的命令普通人也不大会去记 现用现翻文档
ningxing
123 天前
新建分支就行了啊,不同分支不同记录,只是你只关心 a 和 b 文件,其他文件不用关心
xiangyuecn
123 天前
@magggia “没戏,跟 git 自身的原理相悖了,不支持”
但又存在 git mv 这个命令,mv 本身按字面意思就是删文件+新建文件,要实现复制只是不需要删文件+新建文件
xiangyuecn
123 天前
@pagxir @ningxing 不需要提分支功能,跟这个复制毫无干系
xubingok
123 天前
我算是看明白了.
假设 a 文件是 1 年前创建的,有 100 条修改记录.

OP 想的是,根据 a 文件复制出一个 b 文件来.同时在 git 中可以看到 b 文件也是 1 年前创建的,也有这 100 条修改记录.

这不是造假么...
C02TobNClov1Dz56
123 天前
简单, a 文件保留, 然后 b 文件开头加一行注释, 历史见 a 文件(
mangoDB
123 天前
你想让「文件 b 」和「文件 a 」具备一样的历史记录,不仅仅是内容的拷贝。我觉得`git`应该无法满足你这个奇怪的需求,这相当于是“伪造”了「文件 b 」的历史记录(仿佛开启了月报宝盒)。

如楼上的几个答案所说,这和“版本控制”的理念是矛盾的。
xiangyuecn
123 天前
@whoosy @xubingok “伪造” “造假”
比如:新文件 b.txt 提交的时候会有新建文件的记录,显示是从 a.txt 复制。就像 mv 一样 显示从 a.txt 改名 新文件名可以看到以前的老文件名记录

维护一下这个记录很难的嘛🙏

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1133693

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX