Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 永久删除提交_Git - Fatal编程技术网

Git 永久删除提交

Git 永久删除提交,git,Git,我使用git存储库作为临时存储。我添加了一些目录,将其推送到远程repo,过了一段时间,在另一台机器上我克隆了repo,使用目录数据,之后我就不再需要它了。因此,我的提交历史记录如下所示: commit dddddddddddddddddddddddddddddddddddddddd Add folder D commit cccccccccccccccccccccccccccccccccccccccc Add folder C commit bbbbbbbbbbbbbbbb

我使用git存储库作为临时存储。我添加了一些目录,将其推送到远程repo,过了一段时间,在另一台机器上我克隆了repo,使用目录数据,之后我就不再需要它了。因此,我的提交历史记录如下所示:

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
,它将是commit
cccc…
)。
我可以删除此文件夹,提交更改,但在
中。git/objects
将保留
C
中的数据,但我不需要它。这就是为什么我想删除commit
cccc…
。我不能使用
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文件夹将保留。这有点像线程问题,因为我有公共资源,一些工作人员希望从中使用。我可以“锁定”存储库,当我完成所有操作时,我可以解锁它并让其他工作人员完成他们的工作,但这并没有时间效率。