文章目錄
背景
清除 git 所有歷史提交記錄方案
清除 git 所有記錄的 bat 批處理腳本
背景
以前開發(fā)中未制定、遵循 git 管理項目標準,隨意(不規(guī)范)的提交 嚴重“污染了”提交歷史,使開發(fā)主線 “臟亂”;
基于以前的倉庫重新開發(fā),這樣可保留以前的配置等文件,但是需要刪除全部的歷史記錄、tag、分支等;
由于自己或其他方面特殊需求,需要保留倉庫的部分屬性(創(chuàng)建時間,說明,主頁等),但需要清除歷史記錄,使其為“新庫”。
基于以上3方面的需求,需要提供一個 在不刪除原倉庫的前提下,清除原倉庫的所有歷史提交記錄(包含:分支、tag) 解決方案。
清除 git 所有歷史提交記錄方案
1.創(chuàng)建新分支
語法:git checkout --orphan <new_branch>
例句:git checkout --orphan latest_branch
使用 --orphan 選項,可創(chuàng)建1個"清潔"分支(無任何的提交歷史,但是當前分支的內(nèi)容一應(yīng)俱全。但嚴格意義上說,這樣創(chuàng)建的分支還不是一個真正的分支,因為HEAD指向的引用中沒有commit值,只有在進行一次提交后,它才算得上真正的分支。
注意:
新的分支名可以隨意命名,但不能和以前的分支名沖突。這兒特別強調(diào)是因為很多人習(xí)慣默認將分支名創(chuàng)建為 master.
本文以 latest_branch 作為新分支名,這個名稱沒有任何特殊含義,你可自定義,只要保證和以后的使用一致即可。
2.添加所有文件
git add .
# 或 git add -A
3.commit代碼
git commit -m "自定義提交說明"
4.刪除原來的主分支(master)
git branch -D master
一般倉庫默認的主分支為 master 分支,如果原來的主分支不是 master, 用實際的主分支名代替。
5.把當前分支重命名為master
git branch -m master
6.最后把代碼推送到遠程倉庫
注意: 有些倉庫有 master 分支保護,不允許強制 push,需要在遠程倉庫項目里暫時把項目保護關(guān)掉才能推送。
git push -f origin master
注意: 推送前 需要使用 git remote -v 查看關(guān)聯(lián)的遠程倉庫的信息(主要是遠程庫的別名)。雖然遠程庫的別名默認是 origin ,但你可能設(shè)置過其他的別名(而非 origin).
推送前,有的情況需要設(shè)置:git branch --set-upstream-to=origin/master master。
7.從遠程庫拉取更新代碼(測試)
git pull
如果別人pull不下來可以敲
git pull -r
8.確定清除歷史記錄的結(jié)果
# 1.查看提交日志
git log --pretty=oneline
# 2.查看分支信息
# 列出所有本地分支
$ git branch
# 列出所有遠程分支
$ git branch -r
# 列出所有本地分支和遠程分支
# $ git branch -a
# 3.查看 tag 信息
# 查看本地標簽
git tag
# 查看遠程標簽
git ls-remote --tags
可登錄遠程倉庫再次確認。
清除 git 所有記錄的 bat 批處理腳本
這兒將上面的步驟封裝為 bat 批處腳本(針對windows),雙擊即可運行。
文件名:fetch_push_clear_all_history.bat
將文本內(nèi)容保存為 UTF-8 格式,文件最好放在 git 倉庫外。如果放在 git 倉庫內(nèi),需要將此文件在 .gitignore中過濾。
chcp 65001
@echo off
set /p gd=輸入要清除歷史提交信息的倉庫目錄的絕對路徑:
echo 待處理的路徑:%gd%
set /p gm=輸入提交說明:
pushd
cd /d %gd%
git checkout --orphan latest_branch
git add -A
git commit -am "%gm%"
git branch -D master
git branch -m master
git push -f origin master
git pull
echo "已清除全部的歷史記錄!"
echo "查看新倉庫信息:"
git log --pretty=oneline
git branch -a
git tag
git ls-remote --tags
pause
popd
exit