検索

ホームページ  >  に質問  >  本文

如何批量删除git仓库中的提交纪录?

如何批量删除一些很久之前的提交记录,但保留那些修改的内容。

某草草某草草2769日前780

全員に返信(1)返信します

  • 滿天的星座

    滿天的星座2017-04-28 09:08:29

    コミット レコードを削除するシナリオをずっと前に説明していなかったので、この質問は少し A/B になっています。これは、その後の Git の使用の選択に影響するため、非常に重要です。例:

    1. 試験前に提出された提出物を履歴から削除したいが、後で保持する必要がある提出物がまだたくさんある場合は、次のようにします:
      1.2 削除する履歴レコードが分散している場合は、Interactive Rebase、自己選択/マージなどを検討できます。 git rebase -i <ref> などgit rebase -i <ref>
      1.1 如果要删除的历史记录是连续的,比如说从最开始到某一刻全部都删除或者是中间一截可以删除,则可以考虑 Onto Rebase,如 git rebase --onto <ONTO_BASE_ref> <START_ref> <END_ref>,其中 STARTEND 之间的是需要保留的部分,而 ONTO_BASE 则是最新的基点;换言之,从 ONTO_BASESTART 之间的历史记录会被干掉。
    2. 若我要删除的历史记录很多,要保留的则很少(比如说就保留最近的一个,以前都不想要了),那索性可以直接创建 Orphan Branch 来重建历史记录。如 git checkout --orphan new_start,这条命令会创建一个叫做 new_start 的分支,该分支没有任何历史记录,但是所有的文件都会原封不动的存在,你可以据此开始重新提交。完成之后甚至可以把旧的分支直接废弃。另外,也可以指定新分支的起点,默认当然是从 HEAD 开始了。
    3. 你还可以把历史记录分成两份(或更多份),其中有的完整,有的则简化等等,具体参见这篇关于 git replace 的文档:http://git-scm.com/2010/03/17/replace.html

    其实还有很多种场景可以说道,Git 的用法非常灵活,即使暂时用不到也值得细细过一遍知道它能做什么样的事情,然后遇到各种复杂的场景就可以自己推导出解决方案了。


    作为 Repo 的维护者,最常见的事情就是从某一 ref 开始到 HEAD保留下来,然后之前的历史删除。因为这个任务比较常见,所以这里也有一个 shell script 分享给你:

    sh#!/bin/bash
    git checkout --orphan temp 
    git commit -m "截取的历史记录起点"
    git rebase --onto temp  master
    git branch -D temp
    

    使用的时候这样(比如该脚本保存叫 git-detach): git-detach <ref>,其中 <ref> 就是你要保留的历史记录的起点。

    需要注意的是,这个脚本只是把历史记录“分离”开来,然后其中的一部分没有了可见的引用因此在历史记录里看不见,然而它们的 git object 仍然存在(换言之你还能恢复过来,自行查阅 git-reflog),如果你真要彻底丢掉这些历史(为了给 repo 减肥),可以用 git gc --prune 1.1 削除する履歴レコードが最初からある瞬間まで連続している場合や、途中のセクションを削除できる場合は、git rebase などの

    Onto Rebase🎜 を検討できます -- <ONTO_BASE_ref> <START_ref>END_ref> に、STARTEND の間の部分が保持される必要がある部分です。 code>ONTO_BASE は最新のベースポイントです。つまり、ONTO_BASESTART の間の履歴が削除されます。
  • 🎜多くの履歴レコードを削除したいが、保持したいレコードはほとんどない場合 (たとえば、最新のものだけを保持する。もう必要ない)、単純に 🎜孤立したブランチ🎜 を作成して、歴史的な記録。たとえば、 git checkout --orphan new_start の場合、このコマンドは new_start というブランチを作成しますが、すべてのファイルはそのまま存在します。それに応じて再送信を開始できます。完了後、古いブランチを直接破棄することもできます。さらに、新しいブランチの開始点を指定することもできます。デフォルトは、もちろん HEAD から始まります。 🎜履歴レコードを 2 つ (またはそれ以上) の部分に分割することもできます。一部は完全なもの、一部は簡素化されたものなどです。詳細については、git replace に関するこのドキュメントを参照してください: http ://git-scm.com/2010/03/17/replace.html 🎜実際、Git の使用法は非常に柔軟であるため、一時的に使用しない場合でも、どのようなことができるかをよく読んでみる価値があります。さまざまな複雑なシナリオに遭遇した場合は、自分で推測して解決します。 🎜 <時間> 🎜リポジトリの管理者として最も一般的なのは、特定の参照から HEAD へのリポジトリを保持し、その後、以前の履歴を削除することです。このタスクは比較的一般的なので、シェル スクリプトも共有します: 🎜 リーリー 🎜これはその使用方法です (たとえば、スクリプトは git-detach として保存されます): git-detach <ref>、ここで <ref> ; これは、保持したい履歴の開始点です。 🎜 🎜このスクリプトは履歴レコードを「分離」するだけであり、その一部には参照が表示されないため、履歴レコードには表示されませんが、🎜git オブジェクト🎜 はまだ存在することに注意してください。それでも復元します) ここに来て、自分で git-reflog を確認してください) この履歴を完全に破棄したい場合 (リポジトリの軽量化のため)、git を使用できます。 gc --prune を実行すると、二度と元に戻すことはできません。 🎜

    追伸: このスクリプトは Orphan Branch に依存していますが、これは Git の以前のバージョン (おそらく v1.7.x 未満) ではサポートされていません。代替手段がある場合は、自分で Google で調べてください。

    返事
    0
  • キャンセル返事