2017-12-20 9 views
2

git pullのような操作をウォッチモード(私の場合はwebpack)のバックグラウンドビルドと同時に実行すると、gitが上書きしたいファイルをコンパイルするために失敗することがよくあります。git操作が進行中かどうかを確認するには?

git操作で現在作業ディレクトリが変更されている間にウォッチャを一時停止するスクリプトを追加したいとします。 git自身が何かを同時にしているかどうかを確認しているので、これは可能です。git

マージが進行中の場合などは興味がありません。gitが現在ファイルを積極的に書いている場合は興味があります。

+0

答えはありませんが、Git操作はすべてアトミックであると考えられます。だから、成功するまであなたのスクリプトから抜け出そうとするかもしれません。部分的に破損した引っ張りの危険はないはずです。 –

+0

'git'コマンドをラップする方が意味がありません(おそらくインデックスを変更するものだけでしょうか?)そうでなければ' webpack'は 'index.lock'などのpingを連続して行わなければならず、衝突を防止する。 – kabanus

+0

@TimBiegeleisen - 動作しません。 'git'がファイルを書き込めないというエラーによって' pull'が中断された場合、既に書き込まれている他のファイルは残っています。新しい 'git pull'を実行すると、作業ディレクトリの既存の変更のためにエラーになります。 @kabanus - いくつかのIDEがgit操作(git cliを使用しない)で使用されている場合は動作しません。 –

答えて

1

私は

yourepo/.git/index.lock 

はそれを作成し、ビットを実行し、それを削除し、少し寝て、その後、繰り返さないとき、存在する場合、チェックするのに十分かもしれないと思います。私は、バックグラウンドプログラムが本当に絶え間なく走っていれば、これは高価だと思うまた、就寝から寝るまでの間にあなたを塞ぐこともあります。

実行可能なオプションは、gitコマンドをラップすることです。純粋にbashで機能はするだろう:

あなたのプロセス、実行するgitのを一時停止します mygitを実行
function mygit { 
    pid=$(ps -eo pid,comm a | grep webpack) 
    pid=${pid%% *} 
    kill -TSTP $pid 
    git $* 
    kill -CONT $pid 
} 

、それは継続させます。もしあなたが好きなのであればメカニズムを使ってgitコマンド自体の振る舞いを変更することもできます。これは、pre(サスペンド)やpost(resume )コミット。これを初期化するチュートリアルはhttps://coderwall.com/p/jp7d5q/create-a-global-git-commit-hookにあります。基本的には、指定されたディレクトリに特定の名前のスクリプトです。

EDIT

私はgitは、Windows上でそれ自身のbashが付属していますので、git-hookソリューションは、Windows上で完全に実現可能であることを追加したい以下のコメントを確認した後。これを行う方法に関するチュートリアルはhttps://tygertec.com/git-hooks-practical-uses-windows/ですが、スクリプトがすべてbashであることを確認してください。唯一の注意点は、PIDを見つけて保留することです。

taskkill //PID <num> 

私はそれを殺すだろう、私はどのように中断するか分からない。多分、Windows 10上でbashでこれがうまくいくでしょう。

+0

ラッパースクリプトは、git CLIが使用されており、Windows上で実行されていないことを前提としています。しかし、ロックファイルへのポインタのおかげで - それは答えが –

+0

@Knaģis正しいかもしれない、申し訳ありません、おそらく質問にWindowsタグを追加?また、グラフィカルインターフェイスを使用することに言及してください。 gitフックはまだ動作し、ある意味では「より良い」ものです。上記の関数を分割する 'pre-commit'フックと' post-commit'フックはあなたのエラーの大半を修正するかもしれません(プルはちょうどフェッチしてマージしてコミットします)、もう少し追加するか、グローバルなものなので、ステータスに影響を与えることさえあります(理由はありません)。 – kabanus

+0

@Knaģis私はWindows上で(自動的に)検索してプロセスを中断する方法がわかりません。 – kabanus

0

他の回答で示唆されているように.git/index.lockを使用すると、ビルド時にgitを起動できないようにビルドスクリプトを変更してビルド中にこのファイルを削除するのを待ちます。

JavaScriptコードが他の誰かにとっても有用であると判明した場合の転記。

const gitIndexLock = path.join(__dirname, "..", ".git", "index.lock"); 
let hasWrittenOwnGitIndexLock = false; 
function lockParallelGitOperations(callback) { 
    if (!fs.existsSync(gitIndexLock) || hasWrittenOwnGitIndexLock) { 
     writeLockFile(); 
     callback(); 
     return; 
    } 

    console.log("Git operation in progress... Waiting..."); 
    const sleepStarted = Date.now(); 
    sleep(); 

    function sleep() { 
     setTimeout(() => { 
      if (fs.existsSync(gitIndexLock)) { 
       if (Date.now() - sleepStarted > 30000) { 
        console.log("Git has been locked for over 30 seconds. Removing foreign lock..."); 
        fs.unlinkSync(gitIndexLock); 
       } else { 
        sleep(); 
        return; 
       } 
      } 

      writeLockFile(); 
      callback(); 
     }, 200); 
    } 

    function writeLockFile() { 
     if (!hasWrittenOwnGitIndexLock) { 
      console.log("Creating .git/index.lock."); 
      fs.writeFileSync(gitIndexLock, ""); 
      hasWrittenOwnGitIndexLock = true; 
     } 
    } 
} 
関連する問題