成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

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

lsxiao / 2840人閱讀

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

上個(gè)周末遇到了一個(gè)這樣的場(chǎng)景

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

睡前本來(lái)準(zhǔn)備上傳到github倉(cāng)庫(kù)

git init

git add -A

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

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

當(dāng)時(shí)我的內(nèi)心

挽救

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

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

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

我們可以實(shí)用git fsck命令顯示他們

git fsck:用于驗(yàn)證當(dāng)前git倉(cāng)庫(kù)數(shù)據(jù)的有效性和一致性,能夠顯示那些"丟失"的commit、blob(文件)、tree等。

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

我們得到一大堆blob的hash ID

unreachable blob 907b308167f0880fb2a5c0e1614bb0c7620f9dc3
unreachable blob 72663d3adcf67548b9e0f0b2eeef62bce3d53e03
...

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

自動(dòng)還原

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

因此我寫了個(gè)簡(jiǎn)單的nodejs腳本(因?yàn)槲冶容^熟悉),篩選還原那些我需要的文件。

首先使用git fsck把hash ID都存到一個(gè)文件里
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原來(lái)是為了處理stdout流的異步數(shù)據(jù)引入的,當(dāng)前同步過(guò)程下不需要
    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)過(guò)幾分鐘的執(zhí)行,我找回了我的代碼

參考鏈接

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

Recovering Git repository from objects only

Git的維護(hù)(git gc和git fsck)

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/38052.html

相關(guān)文章

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

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

    guqiu 評(píng)論0 收藏0
  • Git 基本命令,你都學(xué)廢了嗎

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

    Tecode 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<