20200121のGitに関する記事は4件です。

git help のデフォルトブラウザを変更する

gitでコマンドを調べるときに使うgit help <command>/ git command --helpですが、初めの慣れていないうちはターミナルで調べるよりもブラウザの方が見やすかったりします。
Windowですとデフォルトでブラウザに移遷してくれるのでいいんですが、macだとgitconfigで設定しないと、勝手にvisual studio codeとかのエディターでhtmlを表示してしまい、ソースコードが表示されてしまいます。
なので、デフォルトで好きなブラウザで表示する方法を紹介します。

まずは、というか.gitconfig以下のように設定を行っていただければ全部動きます。

[web]
    browser = "opera"
[browser "opera"]
    path = /Applications/Opera.app/Contents/MacOS/Opera

見ての通りですが、[browser="opera"]の下のpathに設定するブラウザアプリまでのパスはダブルクォーてションで囲まないこと。さらに、ブラウザのパスは実際の実行ファイルまでのパスをしてすることが必須です。単に"/Applicaitons/Opera.app"とはしないように。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Git for Windows + OpenSSH で Windows10 を Git サーバーにする

雑な備忘録

やりたいこと

Windows10 を git サーバーにする。
そのために以下のことをする。

  • OpenSSH で SSH サーバーを動かす
  • パスワードログインを禁止し、SSH Key でログインする
  • ssh の既定のシェルを bash にして git 操作を可能にする
  • クライアントから ssh 経由で git 操作する

OpenSSH の設定

この辺を読んでいいようにする。

クライアントからの接続

事前に SSH Key を作成し、サーバーの authorized_keys に公開鍵を追加しておくこと

リモートリポジトリが c:\repos\test.git だとすると

git remote add origin ssh://<username>@<hostname or IP>/c/repos/test.git

でリモートリポジトリを設定する。
username は Windows のユーザー名を入れること。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

gitでコンフリクトが発生してしまった.... その解消方法

はじめに

最近コンフリクトが発生することがあったので、
そろそろ備忘録として残しておきたいと思いました。

状況

ツールはgitlabです。
作業ブランチからリクエストを送ったら、差分が生じました。
私の備忘録としてのこしていたメモには
git pull --rebase origin developと記してあり、
疑いもなくそのまましようしてしまいました。

そもそもこのコマンドは何をしているのかというところで
いかの記事参考にしました。

以下、参考サイト様↓
https://qiita.com/KTakata/items/d33185fc0457c08654a5

このコマンドを打つことによって元の歴史(log)まで改変されてしまう....。
複数人での開発の際は大変なことになります。

解消法

ありがたいことにみつけました。(Google検索で上位でした。)
参考にしました。ありがとうございます。

以下、参考サイト様
https://qiita.com/crarrry/items/c5964512e21e383b73da

まとめ

このコマンドが一体に何をしているのか自信がなければ、調べる様にしたいとおもいます....。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ブランチ間の差分をExcelに出力してみたよ!

始めに

この記事は、マクロを使って別のアプリケーションを動かせないか、を検証してみたものです。
今回はgitをコマンドプロンプト経由で使ってみました!
(本当は直接gitを操作したかったけど、実行方法がイメージできなかった . . . )

毎度のことですが、記事の内容に関して「ここおかしい!」とかあったら、コメントお願いします。

 読了時間 : 10 min.(目安)

やりたいこと

Excelにブランチの差分をその種類?(追加・変更・複製・削除)ごとに出力します!
(こんな感じでやります!みたいなgifをここに載せる予定です。)

作業環境

以下の環境で動作確認しています

OS : Windows10 Home
git : 2.22.0.windows.1
Excel : 2016 MSO 32bit

本題の前に

本題に入る前に、gitに関してちょっとだけ補足的な説明です。「そんなのいいからコードはよ!!」というあなたは適当に読み飛ばして下さい。

gitでブランチ間の差分、それもファイル名だけを見ようと思ったら、以下のようなコードを実行すると思います1

# master と develop の差分を見る
> git diff master..develop --name-only

↑の場合だとmasterと比較してdevelopブランチで、
 ・どのファイルを新たに作成したか
 ・どのファイルを修正したか
 ・削除したファイルは何か
などを確認できます。さらに差分の種類?2ごとに表示するなら、--diff-filterを付けて

# 新規追加したファイルだけ差分として表示
> git diff master..develop --name-only --diff-filter=A

とすればOK!指定する文字は、Aは追加(Added)、Mは修正(Modified)、Cは複製(copied)、Dは削除(Deleted)を表してます。--diff-filter=AMみたいな複数指定もいけます、便利!!

とりあえず使い方とコード

使い方としては、
1. 下記のマクロを全部コピペして、
2. E5, E7セルにブランチ名を記載したら、
3. main()を実行

です。E5に指定したブランチ名に対して、E7で指定したブランチの差分が出力されるはずです。
 詳しい説明はさておき、まずはコードを貼ります。コメントも結構書いているので、それだけでも分かる人は何しているか分かるのかな、とも思っています3本当は説明がメンド臭いのであった。

①メインのサブプロシージャ4(矛盾)
最初に実行するプロシージャです。こいつを適当なボタンに設置してマクロを実行します!

main()
Option Explicit

Public Const firstRow As Integer = 7  ' 出力セルの開始行
Public Const firstColumn As Integer = 5  ' 出力セルの開始列

Sub main()

    Dim aryDiffOp() As Variant  ' ファイルの差分をフィルタリングするオプション
    Dim dirPath As String  ' リポジトリのパス
    Dim aryFilePath As Variant ' ファイルのパスを格納する配列
    Dim diffOp As Variant ' 差分オプションのループ変数
    Dim ii As Integer: ii = firstRow  ' 出力する際のループ変数


    ' 差分を取得するリポジトリのパスを設定
    dirPath = getGitDirPath()

    ' 差分オプションの設定
    aryDiffOp = Array("A", "M", "C", "D")

    ' 新規・変更・複製・削除されたファイルをそれぞれ出力する
    For Each diffOp In aryDiffOp

        ' 変更内容ごとにファイルを取得
        aryFilePath = execCmd(dirPath, diffOp)
        If IsNull(aryFilePath) Then
            ' 差分が無い場合
            Call layoutFilePath(Null, diffOp, ii)
        Else
            ' 差分がある場合
            Call layoutFilePath(aryFilePath, diffOp, ii)
        End If
    Next diffOp
    MsgBox "終了!"
End Sub

②gitフォルダのパスを取得する関数
エクスプローラを起動して、.gitが存在するフォルダを選択させる関数です。それだけです。

getGitDirPath()
Function getGitDirPath() As String
    Dim filePath As String

    ' gitフォルダを1つだけ選択させる
    With Application.FileDialog(msoFileDialogFolderPicker)
        .AllowMultiSelect = False

        If .Show Then
            ' フォルダを選択した場合
            getGitDirPath = .SelectedItems(1) & "\"
        Else
            ' フォルダを選択していない場合
            MsgBox "フォルダが存在しません"
            End ' マクロを終了させる
        End If
    End With
End Function

③gitコマンドを実行する関数
今回の主役とも言うべき関数です!!コマンドをわざわざ配列に分けて格納しているのは、完全に趣味です!!
gitのパスを定数として定義しているので、パスが通ってなくても動くように設定していますが、環境に応じて定数を書き換えたり、削除したりして下さい。

execCmd
Function execCmd(ByVal dirPath As String, ByVal diffOp As String) As Variant
    Dim sh  As New IWshRuntimeLibrary.WshShell  ' WshShellクラスオブジェクト
    Dim ex  As WshExec  ' Execメソッド戻り値
    Dim diffFromBranch As String: diffFromBranch = Cells(5, 5).Value  ' 差分比較元のブランチ
    Dim diffToBranch As String: diffToBranch = Cells(5, 7).Value  ' 差分比較先のブランチ
    Dim cmd  ' 実行コマンド
    Dim aryCmd(1)  ' 実行コマンド配列
    Dim gitCmd  ' gitコマンド
    Dim aryGitCmd(5)  ' gitコマンド配列
    Dim result As String  ' コマンド実行結果

    Const git As String = """C:\Program Files\Git\cmd\git.exe"""


    '// gitコマンドを配列に格納
    aryGitCmd(0) = git
    aryGitCmd(1) = "-C " & dirPath
    aryGitCmd(2) = "diff"
    aryGitCmd(3) = diffFromBranch & ".." & diffToBranch
    aryGitCmd(4) = "--name-only"
    aryGitCmd(5) = "--diff-filter=" & diffOp

    '// gitコマンドを空白区切りで連結
    gitCmd = Join(aryGitCmd, " ")
    MsgBox "gitCmd > " & gitCmd

    '// 実行する順にコマンドを配列に格納
    aryCmd(0) = "C:"
    aryCmd(1) = gitCmd

    '// コマンドを連結
    cmd = Join(aryCmd, " & ")
    MsgBox "cmd > " & cmd

    '// コマンド実行
    Set ex = sh.Exec("cmd.exe /C " & cmd)

    '// コマンド失敗時
    If (ex.Status = WshFailed) Then
        '// 処理を抜ける
        MsgBox "処理に失敗しました"
        Exit Function
    End If

    '// コマンド実行中は待ち
    Do While (ex.Status = WshRunning)
        DoEvents
    Loop

    '// 標準出力の結果を表示する
    result = ex.StdOut.ReadAll
    execCmd = splitResultExecCmd(result)
End Function

④差分を配列に格納する関数
差分をファイルパスごとに配列に格納して、呼び出し元のmainへと返しています。差分が無かった場合は、nullを返却しています。
↑の関数で出力された結果は、1ライナーの文字列なので、改行コード区切りで分割しています!なぜそうなるかは不明ですが、最後の配列に空白が入るので、返却前に配列の最後の要素を削ってます。

splitResultExecCmd
Function splitResultExecCmd(ByVal resultExecCmd As String) As Variant
    Dim aryFilePath As Variant ' ファイルのパスを格納する配列

    If Len(resultExecCmd) <> 0 Then
        ' 差分がある場合の処理
        aryFilePath = Split(resultExecCmd, vbLf)
        ReDim Preserve aryFilePath(UBound(aryFilePath) - 1)
        splitResultExecCmd = aryFilePath
    Else
        ' 差分が無かった場合の処理
        splitResultExecCmd = Null
    End If
End Function

⑤ファイルのパスをセルに出力する関数
差分が得られたら、後は煮るなり焼くなりしましょう!下記では、適当なセルを基準にした方向に並べて出力しています。

layoutFilePath
Sub layoutFilePath(ByRef aryFilePath As Variant, ByVal diffOp As String, ByRef i As Integer)
    Dim filePath As Variant   ' 各ファイルのパス

    ' 差分の種類を出力
    Cells(i, firstColumn) = diffOp

    ' 差分の有無で出力内容を分岐
    If IsNull(aryFilePath) Then
        Cells(i, firstColumn + 1) = "差分なし"
        i = i + 1
    Else
        ' ファイルパスを1つずつ出力
        For Each filePath In aryFilePath
            Cells(i, firstColumn + 1) = filePath
            i = i + 1
        Next filePath
    End If
End Sub

終わりに

最後まで読んで下さり、ありがとうございました。

ひとりごと

毎回「始めに」で何を書くか迷っているんですよね . . . (みんなどうしているのかな?)
読み物として楽しい記事を作りたいので、イイ感じに書けるように修行ですね!

参考

[1]VBAでコマンドプロンプトの起動とコマンドの実行を行う
[2]Nullを判定する-IsNull関数
[3]【VBA入門】配列の初期化(ReDim、Preserve、Array、Erase)
[4]VBAでフォルダパスを取得する
[5]Application.FileDialog プロパティ (Excel)
[6]【VBA入門】Functionの使い方(呼び出し、引数、戻り値)
[7]VarType Office TANAKA


  1. git logでも同じようなことが出来ますが、今回はスルー。 

  2. これ、表現として正しいんですかねぇ?誰か教えてくれません? 

  3. 分からなくでも大丈夫です。汚いコードを書いた筆者に全ての責任はあります。少しずつ修正しているので、大目に見てやって下さい . . . 。 

  4. てっきりサブルーチンだと思ってました。fortran勢なのでw 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む