製作一個文件同步工具,自動同步到gitee中。。。

herry菌發表於2021-12-23

之所以要做這個工具是為了讓自己可以隨時用電腦時能記錄日常工作或生活。一般只需要簡單記錄下就行了。這樣我在家裡的和公司裡的記錄都能同步看到。

這樣後期整理的時候看到幾個關鍵詞就能想起來具體的事情,有的也可以為日後整理成文章做一個草稿,這樣寫文章才能有頭有尾,否則想到什麼說什麼是非常不利於寫出文章的。

一開始我使用手動同步的方式,但是發現很麻煩,之後就直接用了個批處理檔案來一次性同步。

git pull
git add .
git commit -m '同步'
git push
git status
@echo off
pause

但是這樣還是有幾個缺點:

1.有時候會忘記執行同步,特別是下班的時候,直接關機的。

2.如果一開始忘記同步了,後面就會產生git衝突。體驗不是太好。

 

因為後來抽時間寫了個小程式。只要把程式執行在後臺,每過一段時間就會自動將文件同步起來。

本地改過內容會自動同步到git倉庫,git倉庫內容被改後,又會自動拉取最新內容同步到本地,這樣就能保證遠端倉庫和本地最新了,兩臺電腦直接的內容也就同步了。

 

我們開看下實現方式:

首先我們必須要有個git倉庫用來儲存資料。

gitee.com申請開個倉庫就行。建立後得到遠端倉庫的地址,複製下來備用。

 

本地建立一個資料夾用於同步文件資料。

檔案加中執行 npm init -y 建立package.json

 

進行繫結遠端倉庫:

git init  #進行初始化倉庫
git remote add origin [你的倉庫地址] 
git push origin 
git push --set-upstream origin master  #首次同步倉庫

 

這樣之後就可以直接執行工具了。

 

在資料夾新增檔案index.js

在資料夾中安裝依賴包

yarn add child_process
yarn add iconv-lite
yarn add moment

 

index.js中寫入程式碼:

const child_process = require("child_process");
const iconv = require("iconv-lite");
const moment = require("moment");

const encoding = "cp936";
const binaryEncoding = "binary";

//執行一行cmd命令
function cmd(text) {
  return new Promise((resolve, reject) => {
    child_process.exec(
      text,
      { encoding: binaryEncoding },
      (err = "", stdout = "", stderr) => {
        if (err) {
          resolve(err);
          return;
        }
        resolve(iconv.decode(Buffer.from(stdout, binaryEncoding), encoding));
      }
    );
  });
}

//cmd執行順序
async function run() {
  const time = moment().format("YYYY-MM-DD HH:mm:ss");
  let status = await cmd("git status");
  if (
    status.includes(
      "not a git repository (or any of the parent directories): .git"
    )
  ) {
    //目錄未繫結git地址
    console.log("目錄未繫結git地址");
  } else {
    //已繫結git
    //拉取
    const pull = await cmd("git pull");
    if (
      !pull.includes("Already up to date") &&
      !pull.includes("Already up-to-date")
    ) {
      //拉取下來了最新資料
      console.log(`拉取了最新資料: ${time}`);
    }
    //狀態
    status = await cmd("git status");
    if (status.includes('(use "git add"')) {
      //本地內容有改動 需要提交
      await cmd("git add .");
      await cmd('git commit -m "同步"');
      await cmd("git push");
      console.log(`同步成功: ${time}`);
    }
  }
}

//每30秒執行一次
setInterval(() => {
  run();
}, 1000 * 30);
run();

 

 這樣還不行,因為我們要同步的是指定目錄的檔案,不是當前目錄的檔案。所以我們要將其打包成一個exe檔案,放到需要同步的資料夾中,才能同步指定目錄。

首先我們全域性安裝一個依賴包:pkg

npm install -g pkg

然後在工具的目錄中執行:

pkg -t win index.js

即可將該nodejs專案打包成獨立的exe程式,然後將這個exe程式放在需要git同步的目錄中。

 

另外,為了不把這個exe檔案同步到倉庫中,我們需要排除這個檔案

所以要在同步的目錄中放一個.gitignore檔案,裡面加上一行用於去除該exe檔案

 

 

這個打包出來的檔案:https://www.jianguoyun.com/p/DQGnvHQQ6KKRChjg8qIE

這個配置檔案:https://www.jianguoyun.com/p/DbWJu0MQ6KKRChi486IE

 

相關文章