Git 永久删除提交
我使用git存储库作为临时存储。我添加了一些目录,将其推送到远程repo,过了一段时间,在另一台机器上我克隆了repo,使用目录数据,之后我就不再需要它了。因此,我的提交历史记录如下所示:Git 永久删除提交,git,Git,我使用git存储库作为临时存储。我添加了一些目录,将其推送到远程repo,过了一段时间,在另一台机器上我克隆了repo,使用目录数据,之后我就不再需要它了。因此,我的提交历史记录如下所示: commit dddddddddddddddddddddddddddddddddddddddd Add folder D commit cccccccccccccccccccccccccccccccccccccccc Add folder C commit bbbbbbbbbbbbbbbb
commit dddddddddddddddddddddddddddddddddddddddd
Add folder D
commit cccccccccccccccccccccccccccccccccccccccc
Add folder C
commit bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
Add folder B
commit aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Add folder A
和目录:
.
├── A
├── B
├── C
├── D
└── README.md
一旦我将这些目录推送到repo,我就不会更改这些目录中的数据。我经常重复向我的repo中添加文件夹的操作,这使得存储库增长得非常快
作为一个解决方案,我想删除一个我不需要的文件夹。让它成为目录C
每个文件夹在其提交历史记录中只有一个提交(对于目录C
,它将是commitcccc…
)。我可以删除此文件夹,提交更改,但在中。git/objects
将保留C
中的数据,但我不需要它。这就是为什么我想删除commitcccc…
。我不能使用git revert
,因为它只是替我替换删除和提交过程
我想要的是完全清除文件夹C中的数据和提交cccc…
。有一个选项:git-rebase-i~
。但它打开了一个交互式模式来编辑历史,而我需要一个提交删除的命令方式,这样我就可以添加一个脚本,在完成我的工作后删除不需要的数据
当前问题的解决方案是什么?首先,
git
似乎不是您想要使用的工具。它被设计用来做一件完全不同的事情。与我的解决方案相比,我更喜欢@Michal和@mkrieger1在评论中给出的答案,但我已经写好了,所以发布:
我非常怀疑这是最优雅的方式,但您可以用一个命令替换VISUAL
环境变量,该命令将充当交互式重基指令文件的过滤器,并使git
为您完成工作:使用以下命令
VISUAL='sed-i-n/c4f1c6e/!p'git rebase-i~
例如:
(有一个比下面略好的突出显示)
nikolay@KoLin:~/tmp$git init
已在/home/nikolay/tmp/.Git中初始化空Git存储库/
nikolay@KoLin:~/tmp$touch f g h
nikolay@KoLin:~/tmp$git add f
nikolay@KoLin:~/tmp$git commit-m f
[master(root提交)f9cbe42]f
1个文件已更改,0个插入(+),0个删除(-)
创建模式100644 f
nikolay@KoLin:~/tmp$git add g
nikolay@KoLin:~/tmp$git commit-m g
[master c4f1c6e]g
1个文件已更改,0个插入(+),0个删除(-)
创建模式100644 g
nikolay@KoLin:~/tmp$git add h
nikolay@KoLin:~/tmp$git commit-m h
[bae0beb大师]h
1个文件已更改,0个插入(+),0个删除(-)
创建模式100644小时
nikolay@KoLin:~/tmp$git日志
提交BAE0BE5815E9CA32F43F47EB725AC020B6F0C3(主机->主机)
作者:尼古拉·内切耶夫
日期:周一1月25日16:45:25 2021+0300
H
提交c4f1c6e440988233098cc2dcb8ad8bf3cd1803a2
作者:尼古拉·内切耶夫
日期:周一1月25日16:45:19 2021+0300
G
提交f9cbe428ff170dc400eaa42dd5eea8ef680b5fe5
作者:尼古拉·内切耶夫
日期:周一1月25日16:45:14 2021+0300
F
nikolay@KoLin:~/tmp$VISUAL='sed-i-n/c4f1c6e/!p’git再基-i c4f1c6e~
已成功重新设置基准并更新了基准/基准/主基准。
nikolay@KoLin:~/tmp$git日志
提交2c868b1c50c1def4c60e122305dd402d29fb9fb9(主机->主机)
作者:尼古拉·内切耶夫
日期:周一1月25日16:45:25 2021+0300
H
提交f9cbe428ff170dc400eaa42dd5eea8ef680b5fe5
作者:尼古拉·内切耶夫
日期:周一1月25日16:45:14 2021+0300
F
nikolay@KoLin:~/tmp$
注意,提交散列必须很短,因为git在交互式rebase文件中打印它们很短。您应该使用的确切字符数可能取决于git版本。对我来说是7(git版本2.25.1)
注意:如果在更新
视觉
环境变量后,它打开了一个交互式文本编辑器而不是执行sed
,请尝试根据您描述的内容更新编辑器
变量,Git不是适合您的工具。您似乎正在寻找一个文件同步工具。您可以使用相同的提交消息,然后每次强制推送,这将仅将提交历史更改为最新的提交。这是否回答了您的问题@mkrieger1在我的情况下,它是最合适和最快的tool@Michael有时我需要删除B
,这样A、C、D文件夹将保留。这有点像线程问题,因为我有公共资源,一些工作人员希望从中使用。我可以“锁定”存储库,当我完成所有操作时,我可以解锁它并让其他工作人员完成他们的工作,但这并没有时间效率。