LoginSignup
0
0

More than 1 year has passed since last update.

Gitリポジトリの一括プルを自動化したバッチファイルの作成と説明 ~ git pull -pと開発ブランチへのpull動作の自動化 ~

Last updated at Posted at 2023-03-18

Abstract

  • 毎回[git pull -p]をコマンドで実行し、複数ある作業元となるブランチを個々でPullしていた状態は、無駄な時間がかかる上にミスを誘発する状況であった。
  • その為バッチファイルを作成し一連の動作を自動化することにより、作業時間の削減とさらなるエラー防止を図った。
  • 現在の状態ではコードに無駄がある。しかし解解決法が分からず、修正できていない。

背景

  • 毎回[git pull -p]を使用するのが面倒だった。
  • pullを忘れたことによる問題が多発した。
    • masterブランチやdevelopブランチをpullする前に分岐し、古いバージョンをテスト版として配布してしまった等

  • 2023.03.22で変更した理由。
    • checkoutで反映している為、バッチファイル実行後[masterブランチ]に移動してしまう問題があった。
    • 元のブランチに手動で戻るのが面倒なので、checkoutを使用する前にカレントブランチの名前を変数に格納し、最後そのbranchに自動で戻るようにした。

本文

コード

@chcp 65001 @rem バッチファイルの文字コードをがUTF-8にする
@rem 230322_git pull UpStream-p & master and Develop branchs apply.
@rem リモートリポジトリから、全てのbranchを削除も反映してpullする
@rem Develop_fix、Develop_feature、develop、masterのローカルリポジトリを最新にする

cd Development_folder_exists_behind
git pull UpStream -p @rem fork元からpullする。削除も反映する

@ for /f "usebackq" %%i in (`"git symbolic-ref --short HEAD"`) do set now_branch=%%i @rem カレントブランチの名前を変数に格納する
@echo "現在のbranchは [ "%now_branch%" ] です。" @rem @echoにしない場合「現在の~」が2つ出力される

git checkout -B Develop_fix UpStream/Develop_fix
git checkout -B Develop_feature UpStream/Develop_feature
git checkout -B develop UpStream/develop
git checkout -B master UpStream/master

git checkout %now_branch% @rem checkoutコマンド使用前に取得したブランチに移動する

@rem 通常時は実行結果を確認しない
@rem pause

コードの背景

  • このリポジトリのコラボレーターであるが、forkリポジトリを使用している状態である。
  • @echo offを使用せず@を多用しているのは、コマンドは出力してほしい為。
  • @rem pauseはエラーが起きた時、コメントアウトを解除してエラーを表示できるようにする為。
    • 確認したい際に「pause」を打ち直すのが面倒くさい。
    • コマンドを覚えていない為、毎回調べることになる。

コードの説明

@chcp 65001

内容

for /f "usebackq" %%i in (`"git symbolic-ref --short HEAD"`) do set now_branch=%%i

内容
[ループ処理でコマンドを実行するコマンド]
for /f "usebackq" %%i in (`"git symbolic-ref --short HEAD"`) do set now_branch=%%i

for /f "usebackq" %%[アルファベット1文字] in (`"[実行したいコマンド]"`) do [コマンド]
  • [変数名]:now_branchに [実行したいコマンド]:git symbolic-ref --short HEADの結果を格納する。
    • "usebackq"オプション
      • コマンドの出力をfor文で取り扱い可能にする為のオプションである。
      • これがない場合、(`ファイル名`)での取り扱いになり、ファイル内のテキストを操作するコマンドとなる。
        • "usebackq"を消した場合の実行結果
          D:\In_front_of_the_development_folder\Development_folder_exists_behind>for /F %i in (`"git symbolic-ref --short HEAD"`) do set now_branch=%iファイル `"git symbolic-ref --short HEAD"` が見つかりません。
          
          • このようにgit symbolic-ref --short HEADをコマンドではなくファイル名として認識してしまう。
    • %%i
      • このfor文はC#のforeach文と似た構造になっている。
      • コレクションの要素(コマンド実行結果)を取得する変数。
      • [実行したいコマンド]をiに格納し、[実行したいコマンド]の出力に対して[コマンド]を実行できるようにする。
[カレントブランチの名前を取得するコマンド]
git symbolic-ref --short HEAD
[変数に格納するコマンド]
do set now_branch=%%i

do set [変数名]=[格納内容]
  • 変数の初期化と代入を行う。
  • [実行したいコマンド]:git symbolic-ref --short HEADの出力結果が格納されている%%iを、do setで宣言した[変数名]:now_branchに代入する。
  • これらにより、カレントブランチの名前がnow_branchに格納される。

cd Development_folder_exists_behind

内容
  • このコード以降のコマンドを実行したいフォルダである、
    カレントフォルダ(batファイルが存在するフォルダ)の階層に存在しているフォルダに移動する。
    • Development_folder_exists_behindはクローンしたフォルダであり、
      このbatファイルが存在するのはローカルリポジトリではなく、
      一つ前の階層のフォルダ。

git pull UpStream -p

内容
  • プルーンオプションを使用してUpStreamからすべてのブランチをpullする。
    • プルーンオプション(-p)は、リモートリポジトリの削除も反映させる。

git checkout -B [ローカルブランチ名] [追跡元となるブランチ名]

内容
  • git checkout -B master UpStream/master

    • 「ローカルブランチ:masterを削除し、
      追跡元となるブランチ:UpStream/masterを追跡した、
      ローカルブランチ:masterを作成する」


      • -Bオプションにより、
        元々存在しているローカルブランチを削除し、再度リモートブランチを追跡する同じ名称のローカルブランチ(master)を作成している。。
        • 削除の工程を挟む為、プルしたいブランチが編集されていてもエラーが生じず反映することができる。

        • 注:
          • ここでcheckoutしているブランチは、UpStreamで保護されているブランチであり、コミットしてはいけない物。
          • 変更されてはいけない物の為、自身が編集していてもそれを無視し削除して問題がない。
実行結果
D:\In_front_of_the_development_folder\Development_folder_exists_behind>git checkout -B master UpStream/master
Switched to and reset branch 'master'
branch 'master' set up to track 'UpStream/master'.
Your branch is up to date with 'UpStream/master'.
実行結果翻訳
ブランチ「master」に切り替わり、リセットされる。
ブランチ 'master' を追跡するように設定する 'UpStream/master'です。
あなたのブランチは 'UpStream/master' で最新になります。

課題点

注釈

*1_リモート追跡ブランチ
  • VSCode上の画面でここにある物
    • リモート追跡ブランチとは何か?_VSCode上の画面
*2_ローカルブランチ
  • VSCode上の画面でここにある物
    • ローカルブランチとは何か?_VSCode上の画面

参考資料 & 謝辞

2023.03.18 投稿時分


2023.03.22 更新分


余談
  • この記事の内容を全てChatGPTさんに渡し「この内容に合うタイトルを提案してください」と問いかけたら、全て英語に翻訳されました…
    • 何度か質問内容を変更して聞いたのですが、記事の内容を置いてから日本語で質問すると英語で返答されてしまいました。
    • 「# Abstract」が先頭にあり、
      尚且つコードやURLの部分で英語が多かった為に、英語判定されてしまったのだと考えられます。

  • [フールプルーフ]の考え方を[フェールセーフ]と勘違いしていました。
    • 記事に使用したい言葉が誤用でないか確認した時に覚え間違いに気が付くことができました。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0