国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

如何從 git reset --hard 中拯救代碼

lsxiao / 2764人閱讀

摘要:首先使用把都存到一個文件里原來是為了處理流的異步數(shù)據(jù)引入的當前同步過程下不需要匹配規(guī)則于是經(jīng)過幾分鐘的執(zhí)行我找回了我的代碼參考鏈接的維護和

上個周末遇到了一個這樣的場景

場景
自己寫了大半天的一個小東西的代碼,目錄結(jié)構(gòu)大概如下
node_modules
src
  - ...files
test
  - test.js
package.json

睡前本來準備上傳到github倉庫

git init

git add -A

發(fā)現(xiàn)忘記添加.gitignore,把node_modules文件都add進去了
于是手賤輸入了git reset --hard

然后發(fā)現(xiàn)...目錄里的東西全部沒了(只剩下.git/文件架),

當時我的內(nèi)心

挽救

心急如焚懊悔不已的我,經(jīng)過查閱相關(guān)資料,還是找到了一些拯救代碼的方法

由于每次git命令進行操作時git都會對相關(guān)文件進行快照,并通過一定形式把信息保存再.git/目錄下。

由于此前我使用過git add -A命令,因此當文件被放進暫存區(qū)時,快照信息對象就已經(jīng)保存了,而實用git reset --hard之后,這些對象就變成了懸空文件對象(dangling blob)。

我們可以實用git fsck命令顯示他們

git fsck:用于驗證當前git倉庫數(shù)據(jù)的有效性和一致性,能夠顯示那些"丟失"的commitblob(文件)、tree等。

我們可以通過以下命令
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)")

我們得到一大堆blob的hash ID

unreachable blob 907b308167f0880fb2a5c0e1614bb0c7620f9dc3
unreachable blob 72663d3adcf67548b9e0f0b2eeef62bce3d53e03
...

接下來使用git show就能顯示這些對象的內(nèi)容了,例如git show 907b308

自動還原

但是由于我曾經(jīng)添加的文件實在太多node_modules里的文件可能有上千個,因此對逐個ID進行git show肉眼篩選是非常不科學。

因此我寫了個簡單的nodejs腳本(因為我比較熟悉),篩選還原那些我需要的文件。

首先使用git fsck把hash ID都存到一個文件里
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") > allhashes

"use strict";

const fs = require("fs");
const shelljs = require("shelljs");
const through = require("through2");

let buf = fs.readFileSync("./allhashes")
buf = buf.toString();
let hashes = []
buf.replace(/dangling blob (w+)/gi,function (matached, hash) {
    hashes.push(hash)
});

let all = hashes.length;
let left = all;
hashes.forEach(hash=>{
    let fullContent = ""
    let stdout = shelljs.exec("git show "+hash,{silent:true}).stdout;
    let input = through();
    console.log((left--)+"/"+all);
    //TODO:through2原來是為了處理stdout流的異步數(shù)據(jù)引入的,當前同步過程下不需要
    input.pipe(through((buf,_,next)=>{
        fullContent = fullContent+buf.toString();
        next(null,buf)
    },flush=>{
        if (matchContent(fullContent)){
            fs.writeFile("./objects/"+hash,fullContent)
        }
        flush()
    }))

    input.push(stdout);
    input.push(null);
})

function matchContent(content){
    // ... 匹配規(guī)則
}

于是經(jīng)過幾分鐘的執(zhí)行,我找回了我的代碼

參考鏈接

Undo git reset --hard with uncommitted files in the staging area

Recovering Git repository from objects only

Git的維護(git gc和git fsck)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/38052.html

相關(guān)文章

  • 關(guān)于git刪除遠程commit

    摘要:很多原因可能會導致我們想刪掉遠程服務(wù)器上提交的版本。下面主要說一下刪除的命令行。然后通過命令提交到遠程庫。這里一定要注意注意再注意注意提交到遠程庫之后,的代碼會直接從遠程庫里面刪除。,代表的是最新版本的上一個版本,以此類推。 額,怎么開頭呢,從文章的定位開始吧。這篇文章的目的就是定位給完全的小白,像我這樣,對于互聯(lián)網(wǎng)知識不了解的人,但是特別渴望學習,小白文章小白文章小白文章!重要的事情...

    guqiu 評論0 收藏0
  • Git 基本命令,你都學廢了嗎

    摘要:掌握了命令行,使用圖形化工具如探囊取物。管理的文件狀態(tài)已修改已暫存已提交。由于我們使用了命令,但并未創(chuàng)建新的分支,所以創(chuàng)建了一個匿名分支。省略遠程分支名表示將本地分支推送到與之存在追蹤關(guān)系的遠程分支通常同名。概述此篇博文意在讓新手快速上手 Git,滿足工作中的基本需求,而非梳理細節(jié)。后續(xù)會再開一個系列,來探討 Git 細節(jié)問題。一、Git 的安裝這部分網(wǎng)站上資料非常多,根據(jù)自己的系統(tǒng)版本查找...

    Tecode 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<