20200406のGitに関する記事は10件です。

【Git】ベアリポジトリとノンベアリポジトリ

ベアとノンベアの違い

今回はリポジトリの概念であるベアとノンベアについて説明して行きます。

ベアリポジトリ

ワーキングディレクトリを持たない、Gitの更新情報だけを持っているリポジトリ。

ノンベアリポジトリ

ワーキングディレクトリを持つリポジトリ。

つまりベアリポジトリは作業用のフォルダやファイルなどの情報を持つ物で、ノンベアリポジトリはGitの更新管理をするための物ということになります。

ベアリポジトリとノンベアリポジトリの仕組み

ベアリポジトリ集中管理型
16144747077_787354afda_z.jpg
ベアとノンベアの仕組みは上記の画像の通り、ローカルからのプッシュは全てリモートのベアリポジトリに対して行い、その後ノンベアリポジトリがベアリポジトリからプルして情報を更新するという仕組みみたいです。

ノンベアリポジトリ管理型
16328853931_990fb4c068_z.jpg
作業PCが一つだけで複数人で開発しないなら、上記のようにリモートにノンベアリポジトリを作り作業することができます。
ただ実際にやると警告が出るみたいで、またGitにはファイルロック機能がないので、複数人で使用する場合はデータに不整合が生まれるので、基本的にはベアとノンベアを使い分けてGitを管理した方が良いみたいです。

ベアリポジトリとノンベアリポジトリの切り替え

各当のノンベア・ベアリポジトリのあるディレクトリまで移動したとした場合

//non-bare repositoryからbare repositoryに変換
git config core.bare true

//bare repositoryからnon-bare repositoryに変換
git config core.bare false

参考

https://www.nekotricolor.com/entry/theory-of-bare-and-non-bare-repository-manage-wordpress-themes-with-git
https://qnighy.hatenablog.com/entry/2017/02/25/154752

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

Github(Git) 入門

はじめに

春ですね,ご入社,ご入学おめでとうございます.この時期にGithub入門する人も多いと思います.この記事はせっかく社内ドキュメント作るのなら共有しちゃおうというものです.特有の言い回しなどはかみ砕いて説明するので,多少の相違は了承ください.

なぜ必要? クラウドストレージと何が違うの?

更新の時系列がわからないディレクトリがあなたのパソコンにはありませんか? 版を管理することをバージョン管理といいますが,ソフトウェア開発,デザイン,文筆などあらゆることでバージョン管理は煩わしいものです.更にチームになるとこのようなファイルがクラウドストレージにあったら,チームメンバーは混乱してしまいます.個人でもチームでもこんなことに時間をさきたくないはずです.
スクリーンショット 2020-04-05 17.50.42.png
この煩わしさからGitは開放させてくれます.Gitは時系列順に版をスナップショットとして管理するバージョン管理システムです.Gitにcommitすることによって版が作成され更新されます.もとに戻したければ戻せますし,別バージョンを作りたければbranchを切ることによってできます.

スクリーンショット 2020-04-06 21.27.47.png

GitとGithub

Githubはバージョン管理システム(ソフトウェア)であるGitをクラウドサービスとして使えるようにしたもので,現在はMicrosoftによって運営されています.同等のサービスやソフトウェアとしてBitbucketやGitLabなどのプロジェクトがあります.

Bitbucket
GitLab

Gitはサーバークライアントとローカルクライアントが存在し,サーバーの方をサーバーに,ローカルをパソコンにインストールすることで使用します.Gitをサーバーにインストールすることによってバージョン管理サーバーとして,チーム内で共有することができるわけです.

スクリーンショット 2020-04-06 21.20.56.png

gitをローカルで使用する場合まず,

zsh
$ git --version #でバージョン情報を表示します.

#=== 以下戻り値 ====
-git version 2.21.0 (Apple Git-122.2) 
#インストールされている場合はこのようなバージョン情報が表示されています.
-git: command not found
#not foundが表示される場合はgitをインストールする必要があります.

not found の場合例えばmacでしたら,
$ brew install git
$ sudo apt install git
などを使いインストールします.これは個人の環境で違います.
インストールが終わったら,

zsh
$ git config --global user.email <your e-mail address>
$ git config --global user.name <your user name>

注意

このアドレスと名前はgithub上で世界に公開されます.

GithubとGitの使い方

gitはレポジトリ(リポジトリ)という単位でプロジェクトを管理します.レポジトリとはプロジェクトのディレクトリーのこととの認識で構いません.このレポジトリにはリモートとローカルが存在します.ローカルは自分のPC内にあるもので,リモートはそれをサーバーにアップロードした状態のことを言います.
プロジェクトのルートレポジトリにある.gitという隠しファイル(サブディレクトリ)に更新情報やリモートレポジトリの情報が記載されています.

Gitのフロートしては,clone して add して commit して pushします.
スクリーンショット 2020-04-06 21.42.22.png

1.レポジトリを作る

まずプロジェクトを始めるにあたってリモートレポジトリであるGithubにレポジトリを作成します.本来はレポジトリを作る場合,

zsh
$ mkdir hoge        #ディレクトリの作成
$ git init          #gitの初期化(.gitの作成)
$ touch readme.md   #説明書の作成
$ touch LICENSE     #Licenseファイルの作成

を実行する必要がありますが,Githubではレポジトリを作ると自動で,git initを実行してreadme.mdやLICENSE,.gitを作成してくれます.
スクリーンショット 2020-04-06 21.44.57.png
試しにhogeレポジトリを作ります.

2.clone

リモートレポジトリにあるレポジトリをローカルにダウンロードすることをcloneといいます.cloneするには任意の場所で,

$ git clone <hoge url or git>

を実行します.ダウンロードされたhogeは一見readme.mdとLICENSEだけですが,きちんと.gitが含まれています.

スクリーンショット 2020-04-06 22.01.12.png

Githubではこのcloneコマンドの他に,右上の緑色のボタンからzip形式でcloneすることもできます.プロジェクトメンバーで開発に参加していない人でも最新のzipを手軽にダウンロードすることが可能です.

スクリーンショット 2020-04-06 21.53.05.png

3.add

cloneした状態に新しいファイルを作成したならばaddが必要です.addはあたらしいファイルを管理リストに追加することです.これでファイルの変更を追従できるようになります.

zsh
$ git add -A

どのファイルが追加されていないかなどは

zsh
$ git status

で確認できます.
スクリーンショット 2020-04-06 22.03.44.png
追従していないファイルが表示されている.
スクリーンショット 2020-04-06 22.04.44.png
addをすることで追従される.

4.commit

既存のファイルを編集したときや,新しいファイルをaddしたときにはcommitをします.commitをすることで新しい版(バージョン)が作成されます.
どこまでやったらcommitするかは自由ですが,戻せない変更をする場合は,する前にかならずcommitします.セーブポイントできちんとセーブをしておけば,ラスボスで負けても再挑戦ができるわけです.

commitには何を変更したかcommit messageを添えます.

zsh
$ git commit -am "example commit"

またcommitした変更はコミット履歴という形で履歴に残ります.

zsh
$ git log

スクリーンショット 2020-04-06 22.06.20.png

5. push

commitはローカルストレージのプロジェクトディレクトリ内の.gitに記録されます.この情報をスナップショットと一緒にアップロードすることをpushといいます.
pushを行うことでリモートレポジトリを更新し最新にします.チームメンバーはgit pullをすることで,常に最新版を使うことができます.

zsh
$ git push origin master #masterブランチにpush
$ git pull

チーム開発の場合,大抵はmasterブランチにはpushをせずにそれぞれのバージョンのブランチにpushし,それをmergeすることでmasterを最新に保ちます.これはバグなどの影響を最小限に留めるためです.

スクリーンショット 2020-04-06 21.48.12.png
pushするまえ
スクリーンショット 2020-04-06 22.07.45.png
pushしたあと

GUIソフト

Sourcetreeなどを使えばterminalではなく視覚的なソフトからでもGitを操作することができます.
スクリーンショット 2020-04-06 22.23.08.png


以上,いちばん基本的なGit及びGithubの使い方でした.

参考

Git --distributed-is-the-new-centralized

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

[個人開発]GoogleSpreadSheetをgit管理のような事をする!とっても愚かなCSVコンテンツトラッカー 「sit」

はじめに

gitコマンドの管理をGoogleSpreadSheetでした人はいても、GoogleSpreadSheet自体のgit管理はよく問題にされては今まで諦められてきました。

sit用の画像.png

「GoogleSpreadSheetをgit管理するのは無理なんじゃないか」

たしかに無理です。(断定していいのか?...む、無理だよね?)

しかし、git管理に近い事はできるという事をこの記事で示したいと思います。これから紹介するコマンドは完全ではないものの、ちょっと希望を感じれるそんなコマンドです。

その名は sit です。

対象読者

  • GoogleSpreadSheetの魔改造に興味がある人
  • おもちゃCLI大好きな人
  • 何か新しい刺激をもとめている人

What is sit?

sit は非常に非常に愚かなcsvコンテンツトラッカーです。gitのようにGoogleSpreadSheetCSVデータを管理したいという考えから生まれました。だから、 sitgit に非常に似ています。 sit という名前はsheet git に由来します。ですが違いがあります。gitgit コマンドだけで完結できますが、 sit はできません。GoogleSpreadSheetのスクリプトを管理するために clasp コマンドを使用する必要があります。

これからチュートリアルを通して説明していきます。

Tutorial

チュートリアルは以下の項目を用意しています。

  • Install sit
  • Initialize sit
  • Create local repository
    • Setting user.name and user.email -Create remote repository
    • Setting Sheet Sharing
  • Edit data and Push for GoogleSpreadSheet
    • Create remote master sheet
    • Checkout and Edit data and Push
  • Fetch from GoogleSpreadSheet
  • Resolve Conflict
  • Stash File Changes
  • Create Pull Request
  • Learn More

Install sit

まず sit コマンドをインストールします。

npm install -g @yukihirop/sit

Initialize sit

ローカルリポジトリを作成する前に、.sitsetting という設定ファイルを作成する必要があります。

最低限必要な設定は認証設定です。その他の設定については、SitSettingを参照してください。

$ mkdir sit-tutorial
$ cd sit-tutorial
$ sit init
created setting file: /Users/yukihirop/JavaScriptProjects/sit-tutorial/.sitsetting

.sitsetting は以下のように生成されます。

version: 1.0.0
sheet:
  gss:
    auth:
      credPath: ./creds.json
    openAPIV3Schema:
      type: object
      properties:
        ja:
          type: string
          description: 日本語
        en:
          type: string
          description: 英語
        key:
          type: string
          description: キー
    defaultWorksheet:
      rowCount: 10000
      colCount: 20
repo:
  local: .sit
dist:
  path: ./dist
  sheetName: master_data.csv

それではGoogleSpreadSheetにアクセスするための認証設定をしていきます。

GoogleCloudPlatformにアクセスし、サービスアカウントを発行します。

image

次に、認証ファイルをcreds.jsonとしてダウンロードします。

image

もし正しくダウンロードできれば sit-tutorial のディレクトリは以下のようになってます。

image

これでGoogleSpreadSheetにアクセスできるようになったといいたいのですが、実はもうちょい設定が必要です。
続きは Create Remote Repository で説明します。

?Google Sheets APIが有効になっている事を確認してください

image

Create local repository

ローカルリポジトリを作成しましょう。
ローカルリポジトリの名前 .sitsetting の設定で変更できますが、ここではデフォルトの .sit を使用します。

$ sit repo init
created local repository: ./.sit
created dist file: dist/master_data.csv
created script files: .sit/scripts/clasp

このとき、以下の3つのファイルが生成されます。

  • sit管理をするために必要なファイル (.sit以下のファイル)
  • 管理対象の dist/master_data.csv
  • GoogleSpreadSheet に設定されるスクリプト

3番目のスクリプトファイルはリモートリポジトリを作るのに使われます。

user.nameとuser.emailの設定

gitでも設定するように user.nameuser.email を設定すると、誰がコミットしたかなどがわかり、ログがわかりやすくなります。なので設定しましょう。

グローバル設定とローカル設定がありますが、ここではローカルに設定します。

sit config --local user.name yukihirop
sit config --local user.email yukihirop@example.com

設定されたか確認してみましょう。 .sit/config で設定されていることがわかります。

$ cat .sit/config
[user]
name=yukihirop
email=yukihirop@example.com

Create remote repository

ここいうリモートリポジトリはGoogleSpreadSheetであり、GASスクリプトによって疑似リポジトリとして動作できるものを指します。したがって、GoogleSpreadSheetを生成し、GASスクリプトを設定する必要があります。これは clasp コマンドを使用して行われます。

$ clasp create --type sheets
Created new Google Sheet: https://drive.google.com/open?id=1QPNoQcKGQrk1U9_5RP42y7YbWZMcPcN-Vn96wO2ZCh8
Created new Google Sheets Add-on script: https://script.google.com/d/1GmpSBRbopUky8dkWTHIX88Vj47lHmH8q8melU_zkSEaM0uslRvozbj6c/edit
Warning: files in subfolder are not accounted for unless you set a '.claspignore' file.
Cloned 1 file.
└─ appsscript.json

GoogleDrive タイプのURLのままでは使用できないため、アクセスして GoogleSpreadSheet タイプのURLを取得します。

image

この例では以下のようなURLになります。

https://docs.google.com/spreadsheets/d/1QPNoQcKGQrk1U9_5RP42y7YbWZMcPcN-Vn96wO2ZCh8/edit#gid=0

取得したURLを origin に設定します。これで、origin という名前でリモートリポジトリにアクセスできます。

git と同じですね。

$ sit remote add origin https://docs.google.com/spreadsheets/d/1QPNoQcKGQrk1U9_5RP42y7YbWZMcPcN-Vn96wO2ZCh8/edit\#gid\=0

正しく設定されたか確認してみましょう。

$ sit remote get-url origin
https://docs.google.com/spreadsheets/d/1QPNoQcKGQrk1U9_5RP42y7YbWZMcPcN-Vn96wO2ZCh8/edit#gid=0

次に、生成されたGoogleSpreadSheetにGASスクリプトを設定します。設定にはclaspコマンドを使用します。

$ clasp push
└─ .sit/scripts/clasp/Code.js
└─ .sit/scripts/clasp/RemoteRepo.js
└─ .sit/scripts/clasp/const.js
└─ .sit/scripts/clasp/util.js
└─ appsscript.json
Pushed 5 files.
$ clasp deploy
Created version 1.
- AKfycbx7zOoxj4opUQrqA0xtryXvxdYUihPgwGkeJwKmsul6wmf9V-kDbYEReZYU5Op56A7CgQ @1.

さぁ、確認してみましょう。

$ clasp open
Opening script: https://script.google.com/d/1GmpSBRbopUky8dkWTHIX88Vj47lHmH8q8melU_zkSEaM0uslRvozbj6c/edit

image

GASスクリプトがちゃんと設定されていることがわかります。

Setting Sheet Sharing

ダウンロードした creds.json に書かれた client_email のメールアドレスを使って共有設定を行います。

image

これで GoogleSpreadSheet にアクセスする準備は整いました。

Edit data and Push for GoogleSpreadSheet

次にデータを更新して GoogleSpreadSheet にpushしてみましょう。

まずはgitを使う時でもそうであるようにmasterブランチを作成してpushします。

Create remote master sheet

まずは初期状態を確認します。

$ sit status
On branch master

    modified: dist/master_data.csv

no changes added to commit
$ sit branch
$ sit diff
Index: 0000000..35daa93
===================================================================
--- a/dist/master_data.csv
+++ b/dist/master_data.csv
@@ -1,0 +1,1 @@
\ No newline at end of file
+日本語,英語,キー
\ No newline at end of file

つまり、デフォルトでは、追加されるヘッダー分だけ差分が発生してます。

コミットします。(sit add に相当するものは内部コマンドとして実行されます。)

$ sit commit -m "Initial Commit"
[master 0aa608d] Initial Commit

それではpushしましょう。

$ sit push origin master
Writed objects: 100% (1/1)
Total 1
remote:
remote: Create a pull request for master on GoogleSpreadSheet by visiting:
remote:     https://docs.google.com/spreadsheets/d/1QPNoQcKGQrk1U9_5RP42y7YbWZMcPcN-Vn96wO2ZCh8/edit#gid=2143308413
remote:
To https://docs.google.com/spreadsheets/d/1QPNoQcKGQrk1U9_5RP42y7YbWZMcPcN-Vn96wO2ZCh8/edit#gid=2143308413
    * [new branch]    0000000..0aa608d  master -> master

正しくpushされたか確認してみましょう。

$ sit browse-remote

image

正しくpushされている事が確認できます。

Checkout and Edit data and Push

現在、masterブランチにいるので、developブランチにチェックアウトします。

$ sit checkout -b develop
Switched to a new branch 'develop'
$ sit branch
* develop
  master

dist/master_data.csv を以下のように修正しましょう。

日本語,英語,キー
こんにちは,hello,greeting.hello

差分を確認してコミットします。

$ sit diff
Index: 35daa93..b0122f0
===================================================================
--- a/dist/master_data.csv
+++ b/dist/master_data.csv
@@ -1,1 +1,2 @@
-日本語,英語,キー
\ No newline at end of file
+日本語,英語,キー
+こんにちは,hello,greeting.hello
\ No newline at end of file
$ sit commit -m "Initial Commit"
[develop 60243bc] Initial Commit

ログを確認してみましょう。

$ sit log
commit 60243bc893424001185de58890104bc49e853ae5 (HEAD -> develop)
Author: yukihirop <yukihirop@example.com>
Date: Sun Mar 0 18:33:57 2020 +0900 +0900

    Initial Commit

コミットが確認できたので、プッシュしましょう。

$ sit push origin develop
Writed objects: 100% (1/1)
Total 1
remote:
remote: Create a pull request for develop on GoogleSpreadSheet by visiting:
remote:     https://docs.google.com/spreadsheets/d/1QPNoQcKGQrk1U9_5RP42y7YbWZMcPcN-Vn96wO2ZCh8/edit#gid=0
remote:
To https://docs.google.com/spreadsheets/d/1QPNoQcKGQrk1U9_5RP42y7YbWZMcPcN-Vn96wO2ZCh8/edit#gid=0
    * [new branch]    0000000..60243bc  develop -> develop

シートを開いて確認してみましょう。

$ sit browse-remote

image

Fetch and Merge from GoogleSpreadSheet

今、 GoogleSpreadSheetの develop ブランチが master ブランチにマージされて以下のような状態になったとします。

image

?残念ながら、GoogleSpreadSheet同士のマージは手動になります。

では、リモートブランチをfetchしてみましょう。

$ sit fetch origin master
remote: Total 1
From https://docs.google.com/spreadsheets/d/1QPNoQcKGQrk1U9_5RP42y7YbWZMcPcN-Vn96wO2ZCh8/edit#gid=2143308413
  * branch        master    -> FETCH_HEAD
  0aa608d..5f027c5    master    -> origin/master

fetchしてきた内容を確認してみましょう。

$ sit cat-file -p 5f027c5
blob b0122f0795b0be80d51a7ff6946f00bf0300e723
parent 0aa608d96db68ac609bfb27de5036fe63a75fcd5
author yukihirop <yukihirop@example.com> 1585488810621 +0900
committer GoogleSpreadSheet <noreply@googlespreadsheet.com> 1585488810621 +0900

Merge from GoogleSpreadSheet/master
$ sit cat-file -p b0122f0795b0be80d51a7ff6946f00bf0300e723
日本語,英語,キー
こんにちは,hello,greeting.hello

fetchに確かに成功していることが確認できました。

それではfetchしてきたorigin/masterブランチをマージしてみましょう。

$ sit merge origin master
The current branch is 'develop'
Sorry... Only the same branch ('origin/develop') on the remote can be merged

?sitの仕様によってマージされるローカルブランチとリモートブランチは、一致する名前を持つ必要があります。

したがって、masterブランチに一度チェックアウトする必要があります。

$ sit checkout master
Switched to branch 'master'
$ sit merge origin master
Updating b98f96a..aab61a3

Fast-forward
  dist/master_data.csv
  1 file changed

dist/master_data.csv を確認すると、マージされていることが確認できます。

$ cat dist/master_data.csv
日本語,英語,キー
こんにちは,hello,greeting.hello%

Resolve Conflict

今、GoogleSpreadSheetのmasterを手動で変更したとします。

image

この状態で fetch して merge します。

$ sit fetch origin master
remote: Total 1
From https://docs.google.com/spreadsheets/d/1QPNoQcKGQrk1U9_5RP42y7YbWZMcPcN-Vn96wO2ZCh8/edit#gid=1549813878
  * branch        master    -> FETCH_HEAD
  87fbc98..00323a3    master    -> origin/master
$ sit merge origin master
Two-way-merging dist/master_data.csv
CONFLICT (content): Merge conflict in dist/master_data.csv
two-way-merge failed; fix conflicts and then commit the result.

コンフリクトが置きました。 sitオブジェクト をリモートリポジトリ(GoogleSpreadSheet)で管理できないため
three way mergeが使えず、two way mergeでマージを行っているのでコンフリクトは起きやすくなってます。

image

この状態でのマージの様子を見てみましょう。

$ sit merge --stat
fatal: You have not concluded your merge (MERGE_HEAD exists)
Please, commit your changes before you merge.

MERGE_HEAD が存在している。競合を解決してください」というメッセージがでます。

ここで一旦、mergeを取り消してみましょう。

$ sit merge --abort
$ sit merge --stat
Already up to date.

image

元にもどりました。gitと同じで --abort で取り消す事が可能です。

もう一度、merge してみましょう。

$ sit merge origin master
Two-way-merging dist/master_data.csv
CONFLICT (content): Merge conflict in dist/master_data.csv
two-way-merge failed; fix conflicts and then commit the result.

次のようにコンフリクトを解消して、 --continue をしてみてください。

image

$ sit merge --continue
hint: Waiting for your editor to close the file...

image

起動したファイルを閉じ、Ctrl + Cを押してマージを完了します。

$ sit merge --continue
hint: Waiting for your editor to close the file...
^C

それではmergeの状態を調べてみましょう。

$ sit merge --stat
Already up to date.
$ sit log
commit aab61a36fff2bf2dacc87d416a83b6c0e15a569c (HEAD -> master)
Author: yukihirop <yukihirop@example.com>
Date: Tue Mar 2 00:21:45 2020 +0900 +0900

    Merge from GoogleSpreadSheet/master

commit b98f96a746dba25e2c927beda41cf9fa361a44ab
Author: yukihirop <yukihirop@example.com>
Date: Tue Mar 2 00:11:31 2020 +0900 +0900

    Initial Commit

マージが成功しました。

Stash File Changes

次のようにファイルを編集して、stash してみましょう。

image

$ sit stash save
Saved working directory and index state WIP on master: 5fe2e48 Merge remote-tracking branch 'origin/master'

stashした結果の詳細を確認してみましょう。 dist/master_data.csv ファイルを確認してみましょう。

image

$ sit stash list
ffe9070 stash@{0}: On master: WIP
$ sit stash show -p stash@{0}
Index: 9bb9157..0e90f47
===================================================================
--- a/dist/master_data.csv
+++ b/dist/master_data.csv
@@ -1,3 +1,4 @@
 日本語,英語,キー
 こんにちは,hello,greeting.hello
-おやすみ,good night,greeting.good_night
\ No newline at end of file
+おやすみ,good night,greeting.good_night
+歓迎します,wellcome,greeting.wellcome
\ No newline at end of file

stashした内容の復元をしてみましょう。 stash apply を使います。

?stash@{0} は省略できます。stash@{n} (n>0)は省略できないです。

$ sit stash apply stash@{0}
On branch master
Changes not staged for commit:

    modified:    dist/master_data.csv

no changes added to commit

もう一度、stashして、 次はpopでもどしてみましょう。

$ sit stash save "WIP"
Saved working directory and index state On master: WIP
$ sit stash list
2f077ef stash@{0}: On master: WIP
7284116 stash@{1}: WIP on master: 08d2106 Merge remote-tracking branch 'origin/master'
$ sit stash pop
On branch master
Changes not staged for commit:

    modified:    dist/master_data.csv

Dropped stash@{0} (2f077ef6551e339e1808e6fbb38f27424be46b8d)

gitと同様に、popはスタッシュの内容を削除します。

$ sit stash list
7284116 stash@{0}: WIP on master: 08d2106 Merge remote-tracking branch 'origin/master'

Create Pull Request

GoogleSpreadSheetに、masterとは異なる名前(たとえば、develop)という新しいシートを追加しましたが、GitHubのようにdevelopブランチからmasterブランチにプルリクエストを作成することもできます。

master

image

develop

image

developブランチからmasterブランチにプルリクエストを作成してみましょう。

$ sit pull-request origin master...develop
Total 1
remote:
remote: Create a pull request for 'master' from 'develop' on GoogleSpreadSheet by visiting:
remote:     https://docs.google.com/spreadsheets/d/1xZ6egbhsuqIh8kMsfeg8vCkyFGabZQybcxKuc2F7Le4/edit#gid=2115668596
remote:
To https://docs.google.com/spreadsheets/d/1xZ6egbhsuqIh8kMsfeg8vCkyFGabZQybcxKuc2F7Le4/edit#gid=2115668596
    Please look at sheet: '[pr] master...develop' in GoogleSpreadSheet

?実行されるたびにローカルリポジトリに変更を生成するpushコマンドとは異なり、pull-requestコマンドはステートレスコマンドであり、何度でも実行できます。

GoogleSpreadSheet をご覧ください。[pr]master...develop という名前でシートが作られていると思います。

image

?[pr]で始まるシート(ブランチ)名は、プルリクエスト用に予約されているため、ブランチ名として使用できません。

他のシートと違いフッターがあると思います。それについて説明します。

name description
created at 作成日時
reviewers レビュワー
assignees PRを作成した人
message PRの内容を簡潔に書く
labels 自由に活用してください
projects 自由に活用してください
milestone 自由に活用してください

少なくとも reviewrsmessage はかくべきだと考えます。

次に、[ステータス]列について説明します。 [ステータス]列では3つの記号が使用されています。

symbol description
+ 追加
- 削除
± 追加される側にだけ存在

つまり、現在の例では、index==2 の行が変更され、index==3の列はmasterシートにのみ存在し、そのままです。masterシートへのマージはサポートされていないため、問題がなければ、責任者が手動でmasterシートを更新してください。

Learn More

その他のコマンドの使い方などをまとめた公式ドキュメントがあります。そちらをご参照ください。

https://yukihirop.github.io/sit

おわりに

このコマンドを作ったきっかけは会社で引き継いだプロジェクトの翻訳ファイルがGoogleSpreadSheetで管理されていて、それを目で読み取ってyamlファイル(ja.yamlとen.yaml)として別途作成して管理していいる現状を目にして「なんや...この管理のやり方は...」と思ったのが全てのきっかけだった。GoogleSpreadSheetで管理されているのはデザイナーとのやり取りの都合上、仕方のないものだと言われた。手動で作った翻訳ファイル(ja.yaml・en.yaml)がGoogleSpreadSheetで管理されているものと一致していれば、「 まぁ...こういうやり方もあるのかな? 」 で終わっていたのかもしれないが、かなりズレていて合わせるための修正のだるさから「 gitみたいに管理できたらなぁ 」と強く思ってしまった。

それを形にするまでには、大変だった。 まず Git の仕組み (1) のブログと p10.1 Git Internalsを読んで「gitオブジェクトとは何か?」を勉強して、 Write yourself a Git!というpythonでgitコマンドを割と再現していく練習をこなしてイメージを掴んだ後、実装に取り掛かった。gitのソースコードを見たがちっともわからなかったので、 git init したプロジェクトにできた .git の中で git init して各コマンドを叩いた後のファイルの変化をおって想像で実装した。gitのソースコードを見てわかったのは全てC言語で書かれているのかなって思っていたけど、perlで書かれていたり、shellscriptで書かれていたりとバラバラだった事とstashコマンドを作ったのは日本人女性だったという事である。

調査なども含めて3ヶ月〜4ヶ月くらいはかかったがとりあえず最後までやり遂げる事ができてよかった。

せっかく作ったのでGoogleSpreadSheetで管理されている翻訳ファイルをローカルにcloneしてローカルに持ってきて、今まで手動で作っていた翻訳ファイル(ja.yaml・en.yaml)を自動で作成するようにやってみようと思う。

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

[個人開発]GoogleSpreadSheetをgit管理っぽいような事をする!とっても愚かなCSVコンテンツトラッカー 「sit」

はじめに

gitコマンドの管理をGoogleSpreadSheetでした人はいても、GoogleSpreadSheet自体のgit管理はよく問題にされては今まで諦められてきました。

sit用の画像.png

「GoogleSpreadSheetをgit管理するのは無理なんじゃないか」

たしかに無理です。(断定していいのか?...む、無理だよね?)

しかし、git管理に近い事はできるという事をこの記事で示したいと思います。これから紹介するコマンドは完全ではないものの、ちょっと希望を感じれるそんなコマンドです。

その名は sit です。

対象読者

  • コロナ自粛で暇な人
  • GoogleSpreadSheetの魔改造に興味がある人
  • おもちゃCLI大好きな人

What is sit?

sit は非常に非常に愚かなcsvコンテンツトラッカーです。gitのようにGoogleSpreadSheetCSVデータを管理したいという考えから生まれました。だから、 sitgit に非常に似ています。 sit という名前はsheet git に由来します。ですが違いがあります。gitgit コマンドだけで完結できますが、 sit はできません。GoogleSpreadSheetのスクリプトを管理するために clasp コマンドを使用する必要があります。

これからチュートリアルを通して説明していきます。

Tutorial

チュートリアルは以下の項目を用意しています。

  • Install sit
  • Initialize sit
  • Create local repository
    • Setting user.name and user.email -Create remote repository
    • Setting Sheet Sharing
  • Edit data and Push for GoogleSpreadSheet
    • Create remote master sheet
    • Checkout and Edit data and Push
  • Fetch from GoogleSpreadSheet
  • Resolve Conflict
  • Stash File Changes
  • Create Pull Request
  • Learn More

Install sit

まず sit コマンドをインストールします。

npm install -g @yukihirop/sit

Initialize sit

ローカルリポジトリを作成する前に、.sitsetting という設定ファイルを作成する必要があります。

最低限必要な設定は認証設定です。その他の設定については、SitSettingを参照してください。

$ mkdir sit-tutorial
$ cd sit-tutorial
$ sit init
created setting file: /Users/yukihirop/JavaScriptProjects/sit-tutorial/.sitsetting

.sitsetting は以下のように生成されます。

version: 1.0.0
sheet:
  gss:
    auth:
      credPath: ./creds.json
    openAPIV3Schema:
      type: object
      properties:
        ja:
          type: string
          description: 日本語
        en:
          type: string
          description: 英語
        key:
          type: string
          description: キー
    defaultWorksheet:
      rowCount: 10000
      colCount: 20
repo:
  local: .sit
dist:
  path: ./dist
  sheetName: master_data.csv

それではGoogleSpreadSheetにアクセスするための認証設定をしていきます。

GoogleCloudPlatformにアクセスし、サービスアカウントを発行します。

image

次に、認証ファイルをcreds.jsonとしてダウンロードします。

image

もし正しくダウンロードできれば sit-tutorial のディレクトリは以下のようになってます。

image

これでGoogleSpreadSheetにアクセスできるようになったといいたいのですが、実はもうちょい設定が必要です。
続きは Create Remote Repository で説明します。

?Google Sheets APIが有効になっている事を確認してください

image

Create local repository

ローカルリポジトリを作成しましょう。
ローカルリポジトリの名前 .sitsetting の設定で変更できますが、ここではデフォルトの .sit を使用します。

$ sit repo init
created local repository: ./.sit
created dist file: dist/master_data.csv
created script files: .sit/scripts/clasp

このとき、以下の3つのファイルが生成されます。

  • sit管理をするために必要なファイル (.sit以下のファイル)
  • 管理対象の dist/master_data.csv
  • GoogleSpreadSheet に設定されるスクリプト

3番目のスクリプトファイルはリモートリポジトリを作るのに使われます。

user.nameとuser.emailの設定

gitでも設定するように user.nameuser.email を設定すると、誰がコミットしたかなどがわかり、ログがわかりやすくなります。なので設定しましょう。

グローバル設定とローカル設定がありますが、ここではローカルに設定します。

sit config --local user.name yukihirop
sit config --local user.email yukihirop@example.com

設定されたか確認してみましょう。 .sit/config で設定されていることがわかります。

$ cat .sit/config
[user]
name=yukihirop
email=yukihirop@example.com

Create remote repository

ここいうリモートリポジトリはGoogleSpreadSheetであり、GASスクリプトによって疑似リポジトリとして動作できるものを指します。したがって、GoogleSpreadSheetを生成し、GASスクリプトを設定する必要があります。これは clasp コマンドを使用して行われます。

$ clasp create --type sheets
Created new Google Sheet: https://drive.google.com/open?id=1QPNoQcKGQrk1U9_5RP42y7YbWZMcPcN-Vn96wO2ZCh8
Created new Google Sheets Add-on script: https://script.google.com/d/1GmpSBRbopUky8dkWTHIX88Vj47lHmH8q8melU_zkSEaM0uslRvozbj6c/edit
Warning: files in subfolder are not accounted for unless you set a '.claspignore' file.
Cloned 1 file.
└─ appsscript.json

GoogleDrive タイプのURLのままでは使用できないため、アクセスして GoogleSpreadSheet タイプのURLを取得します。

image

この例では以下のようなURLになります。

https://docs.google.com/spreadsheets/d/1QPNoQcKGQrk1U9_5RP42y7YbWZMcPcN-Vn96wO2ZCh8/edit#gid=0

取得したURLを origin に設定します。これで、origin という名前でリモートリポジトリにアクセスできます。

git と同じですね。

$ sit remote add origin https://docs.google.com/spreadsheets/d/1QPNoQcKGQrk1U9_5RP42y7YbWZMcPcN-Vn96wO2ZCh8/edit\#gid\=0

正しく設定されたか確認してみましょう。

$ sit remote get-url origin
https://docs.google.com/spreadsheets/d/1QPNoQcKGQrk1U9_5RP42y7YbWZMcPcN-Vn96wO2ZCh8/edit#gid=0

次に、生成されたGoogleSpreadSheetにGASスクリプトを設定します。設定にはclaspコマンドを使用します。

$ clasp push
└─ .sit/scripts/clasp/Code.js
└─ .sit/scripts/clasp/RemoteRepo.js
└─ .sit/scripts/clasp/const.js
└─ .sit/scripts/clasp/util.js
└─ appsscript.json
Pushed 5 files.
$ clasp deploy
Created version 1.
- AKfycbx7zOoxj4opUQrqA0xtryXvxdYUihPgwGkeJwKmsul6wmf9V-kDbYEReZYU5Op56A7CgQ @1.

さぁ、確認してみましょう。

$ clasp open
Opening script: https://script.google.com/d/1GmpSBRbopUky8dkWTHIX88Vj47lHmH8q8melU_zkSEaM0uslRvozbj6c/edit

image

GASスクリプトがちゃんと設定されていることがわかります。

Setting Sheet Sharing

ダウンロードした creds.json に書かれた client_email のメールアドレスを使って共有設定を行います。

image

これで GoogleSpreadSheet にアクセスする準備は整いました。

Edit data and Push for GoogleSpreadSheet

次にデータを更新して GoogleSpreadSheet にpushしてみましょう。

まずはgitを使う時でもそうであるようにmasterブランチを作成してpushします。

Create remote master sheet

まずは初期状態を確認します。

$ sit status
On branch master

    modified: dist/master_data.csv

no changes added to commit
$ sit branch
$ sit diff
Index: 0000000..35daa93
===================================================================
--- a/dist/master_data.csv
+++ b/dist/master_data.csv
@@ -1,0 +1,1 @@
\ No newline at end of file
+日本語,英語,キー
\ No newline at end of file

つまり、デフォルトでは、追加されるヘッダー分だけ差分が発生してます。

コミットします。(sit add に相当するものは内部コマンドとして実行されます。)

$ sit commit -m "Initial Commit"
[master 0aa608d] Initial Commit

それではpushしましょう。

$ sit push origin master
Writed objects: 100% (1/1)
Total 1
remote:
remote: Create a pull request for master on GoogleSpreadSheet by visiting:
remote:     https://docs.google.com/spreadsheets/d/1QPNoQcKGQrk1U9_5RP42y7YbWZMcPcN-Vn96wO2ZCh8/edit#gid=2143308413
remote:
To https://docs.google.com/spreadsheets/d/1QPNoQcKGQrk1U9_5RP42y7YbWZMcPcN-Vn96wO2ZCh8/edit#gid=2143308413
    * [new branch]    0000000..0aa608d  master -> master

正しくpushされたか確認してみましょう。

$ sit browse-remote

image

正しくpushされている事が確認できます。

Checkout and Edit data and Push

現在、masterブランチにいるので、developブランチにチェックアウトします。

$ sit checkout -b develop
Switched to a new branch 'develop'
$ sit branch
* develop
  master

dist/master_data.csv を以下のように修正しましょう。

日本語,英語,キー
こんにちは,hello,greeting.hello

差分を確認してコミットします。

$ sit diff
Index: 35daa93..b0122f0
===================================================================
--- a/dist/master_data.csv
+++ b/dist/master_data.csv
@@ -1,1 +1,2 @@
-日本語,英語,キー
\ No newline at end of file
+日本語,英語,キー
+こんにちは,hello,greeting.hello
\ No newline at end of file
$ sit commit -m "Initial Commit"
[develop 60243bc] Initial Commit

ログを確認してみましょう。

$ sit log
commit 60243bc893424001185de58890104bc49e853ae5 (HEAD -> develop)
Author: yukihirop <yukihirop@example.com>
Date: Sun Mar 0 18:33:57 2020 +0900 +0900

    Initial Commit

コミットが確認できたので、プッシュしましょう。

$ sit push origin develop
Writed objects: 100% (1/1)
Total 1
remote:
remote: Create a pull request for develop on GoogleSpreadSheet by visiting:
remote:     https://docs.google.com/spreadsheets/d/1QPNoQcKGQrk1U9_5RP42y7YbWZMcPcN-Vn96wO2ZCh8/edit#gid=0
remote:
To https://docs.google.com/spreadsheets/d/1QPNoQcKGQrk1U9_5RP42y7YbWZMcPcN-Vn96wO2ZCh8/edit#gid=0
    * [new branch]    0000000..60243bc  develop -> develop

シートを開いて確認してみましょう。

$ sit browse-remote

image

Fetch and Merge from GoogleSpreadSheet

今、 GoogleSpreadSheetの develop ブランチが master ブランチにマージされて以下のような状態になったとします。

image

?残念ながら、GoogleSpreadSheet同士のマージは手動になります。

では、リモートブランチをfetchしてみましょう。

$ sit fetch origin master
remote: Total 1
From https://docs.google.com/spreadsheets/d/1QPNoQcKGQrk1U9_5RP42y7YbWZMcPcN-Vn96wO2ZCh8/edit#gid=2143308413
  * branch        master    -> FETCH_HEAD
  0aa608d..5f027c5    master    -> origin/master

fetchしてきた内容を確認してみましょう。

$ sit cat-file -p 5f027c5
blob b0122f0795b0be80d51a7ff6946f00bf0300e723
parent 0aa608d96db68ac609bfb27de5036fe63a75fcd5
author yukihirop <yukihirop@example.com> 1585488810621 +0900
committer GoogleSpreadSheet <noreply@googlespreadsheet.com> 1585488810621 +0900

Merge from GoogleSpreadSheet/master
$ sit cat-file -p b0122f0795b0be80d51a7ff6946f00bf0300e723
日本語,英語,キー
こんにちは,hello,greeting.hello

fetchに確かに成功していることが確認できました。

それではfetchしてきたorigin/masterブランチをマージしてみましょう。

$ sit merge origin master
The current branch is 'develop'
Sorry... Only the same branch ('origin/develop') on the remote can be merged

?sitの仕様によってマージされるローカルブランチとリモートブランチは、一致する名前を持つ必要があります。

したがって、masterブランチに一度チェックアウトする必要があります。

$ sit checkout master
Switched to branch 'master'
$ sit merge origin master
Updating b98f96a..aab61a3

Fast-forward
  dist/master_data.csv
  1 file changed

dist/master_data.csv を確認すると、マージされていることが確認できます。

$ cat dist/master_data.csv
日本語,英語,キー
こんにちは,hello,greeting.hello%

Resolve Conflict

今、GoogleSpreadSheetのmasterを手動で変更したとします。

image

この状態で fetch して merge します。

$ sit fetch origin master
remote: Total 1
From https://docs.google.com/spreadsheets/d/1QPNoQcKGQrk1U9_5RP42y7YbWZMcPcN-Vn96wO2ZCh8/edit#gid=1549813878
  * branch        master    -> FETCH_HEAD
  87fbc98..00323a3    master    -> origin/master
$ sit merge origin master
Two-way-merging dist/master_data.csv
CONFLICT (content): Merge conflict in dist/master_data.csv
two-way-merge failed; fix conflicts and then commit the result.

コンフリクトが置きました。 sitオブジェクト をリモートリポジトリ(GoogleSpreadSheet)で管理できないため
three way mergeが使えず、two way mergeでマージを行っているのでコンフリクトは起きやすくなってます。

image

この状態でのマージの様子を見てみましょう。

$ sit merge --stat
fatal: You have not concluded your merge (MERGE_HEAD exists)
Please, commit your changes before you merge.

MERGE_HEAD が存在している。競合を解決してください」というメッセージがでます。

ここで一旦、mergeを取り消してみましょう。

$ sit merge --abort
$ sit merge --stat
Already up to date.

image

元にもどりました。gitと同じで --abort で取り消す事が可能です。

もう一度、merge してみましょう。

$ sit merge origin master
Two-way-merging dist/master_data.csv
CONFLICT (content): Merge conflict in dist/master_data.csv
two-way-merge failed; fix conflicts and then commit the result.

次のようにコンフリクトを解消して、 --continue をしてみてください。

image

$ sit merge --continue
hint: Waiting for your editor to close the file...

image

起動したファイルを閉じ、Ctrl + Cを押してマージを完了します。

$ sit merge --continue
hint: Waiting for your editor to close the file...
^C

それではmergeの状態を調べてみましょう。

$ sit merge --stat
Already up to date.
$ sit log
commit aab61a36fff2bf2dacc87d416a83b6c0e15a569c (HEAD -> master)
Author: yukihirop <yukihirop@example.com>
Date: Tue Mar 2 00:21:45 2020 +0900 +0900

    Merge from GoogleSpreadSheet/master

commit b98f96a746dba25e2c927beda41cf9fa361a44ab
Author: yukihirop <yukihirop@example.com>
Date: Tue Mar 2 00:11:31 2020 +0900 +0900

    Initial Commit

マージが成功しました。

Stash File Changes

次のようにファイルを編集して、stash してみましょう。

image

$ sit stash save
Saved working directory and index state WIP on master: 5fe2e48 Merge remote-tracking branch 'origin/master'

stashした結果の詳細を確認してみましょう。 dist/master_data.csv ファイルを確認してみましょう。

image

$ sit stash list
ffe9070 stash@{0}: On master: WIP
$ sit stash show -p stash@{0}
Index: 9bb9157..0e90f47
===================================================================
--- a/dist/master_data.csv
+++ b/dist/master_data.csv
@@ -1,3 +1,4 @@
 日本語,英語,キー
 こんにちは,hello,greeting.hello
-おやすみ,good night,greeting.good_night
\ No newline at end of file
+おやすみ,good night,greeting.good_night
+歓迎します,wellcome,greeting.wellcome
\ No newline at end of file

stashした内容の復元をしてみましょう。 stash apply を使います。

?stash@{0} は省略できます。stash@{n} (n>0)は省略できないです。

$ sit stash apply stash@{0}
On branch master
Changes not staged for commit:

    modified:    dist/master_data.csv

no changes added to commit

もう一度、stashして、 次はpopでもどしてみましょう。

$ sit stash save "WIP"
Saved working directory and index state On master: WIP
$ sit stash list
2f077ef stash@{0}: On master: WIP
7284116 stash@{1}: WIP on master: 08d2106 Merge remote-tracking branch 'origin/master'
$ sit stash pop
On branch master
Changes not staged for commit:

    modified:    dist/master_data.csv

Dropped stash@{0} (2f077ef6551e339e1808e6fbb38f27424be46b8d)

gitと同様に、popはスタッシュの内容を削除します。

$ sit stash list
7284116 stash@{0}: WIP on master: 08d2106 Merge remote-tracking branch 'origin/master'

Create Pull Request

GoogleSpreadSheetに、masterとは異なる名前(たとえば、develop)という新しいシートを追加しましたが、GitHubのようにdevelopブランチからmasterブランチにプルリクエストを作成することもできます。

master

image

develop

image

developブランチからmasterブランチにプルリクエストを作成してみましょう。

$ sit pull-request origin master...develop
Total 1
remote:
remote: Create a pull request for 'master' from 'develop' on GoogleSpreadSheet by visiting:
remote:     https://docs.google.com/spreadsheets/d/1xZ6egbhsuqIh8kMsfeg8vCkyFGabZQybcxKuc2F7Le4/edit#gid=2115668596
remote:
To https://docs.google.com/spreadsheets/d/1xZ6egbhsuqIh8kMsfeg8vCkyFGabZQybcxKuc2F7Le4/edit#gid=2115668596
    Please look at sheet: '[pr] master...develop' in GoogleSpreadSheet

?実行されるたびにローカルリポジトリに変更を生成するpushコマンドとは異なり、pull-requestコマンドはステートレスコマンドであり、何度でも実行できます。

GoogleSpreadSheet をご覧ください。[pr]master...develop という名前でシートが作られていると思います。

image

?[pr]で始まるシート(ブランチ)名は、プルリクエスト用に予約されているため、ブランチ名として使用できません。

他のシートと違いフッターがあると思います。それについて説明します。

name description
created at 作成日時
reviewers レビュワー
assignees PRを作成した人
message PRの内容を簡潔に書く
labels 自由に活用してください
projects 自由に活用してください
milestone 自由に活用してください

少なくとも reviewrsmessage はかくべきだと考えます。

次に、[ステータス]列について説明します。 [ステータス]列では3つの記号が使用されています。

symbol description
+ 追加
- 削除
± 追加される側にだけ存在

つまり、現在の例では、index==2 の行が変更され、index==3の列はmasterシートにのみ存在し、そのままです。masterシートへのマージはサポートされていないため、問題がなければ、責任者が手動でmasterシートを更新してください。

Learn More

その他のコマンドの使い方などをまとめた公式ドキュメントがあります。そちらをご参照ください。

https://yukihirop.github.io/sit

おわりに

このコマンドを作ったきっかけは会社で引き継いだプロジェクトの翻訳ファイルがGoogleSpreadSheetで管理されていて、それを目で読み取ってyamlファイル(ja.yamlとen.yaml)として別途作成して管理していいる現状を目にして「なんや...この管理のやり方は...」と思ったのが全てのきっかけだった。GoogleSpreadSheetで管理されているのはデザイナーとのやり取りの都合上、仕方のないものだと言われた。手動で作った翻訳ファイル(ja.yaml・en.yaml)がGoogleSpreadSheetで管理されているものと一致していれば、「 まぁ...こういうやり方もあるのかな? 」 で終わっていたのかもしれないが、かなりズレていて合わせるための修正のだるさから「 gitみたいに管理できたらなぁ 」と強く思ってしまった。

それを形にするまでには、大変だった。 まず Git の仕組み (1) のブログと p10.1 Git Internalsを読んで「gitオブジェクトとは何か?」を勉強して、 Write yourself a Git!というpythonでgitコマンドを割と再現していく練習をこなしてイメージを掴んだ後、実装に取り掛かった。gitのソースコードを見たがちっともわからなかったので、 git init したプロジェクトにできた .git の中で git init して各コマンドを叩いた後のファイルの変化をおって想像で実装した。gitのソースコードを見てわかったのは全てC言語で書かれているのかなって思っていたけど、perlで書かれていたり、shellscriptで書かれていたりとバラバラだった事とstashコマンドを作ったのは日本人女性だったという事である。

調査なども含めて3ヶ月〜4ヶ月くらいはかかったがとりあえず最後までやり遂げる事ができてよかった。

せっかく作ったのでGoogleSpreadSheetで管理されている翻訳ファイルをローカルにcloneしてローカルに持ってきて、今まで手動で作っていた翻訳ファイル(ja.yaml・en.yaml)を自動で作成するようにやってみようと思う。会社都合でもうそのプロジェクト外されたけど....

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

Gitをソースからコンパイルしてインストールする。

Gitをユーザーのディレクトリにソースからコンパイルしてインストールする。
だいたいhttps://github.com/git/git/blob/master/INSTALL の記述通り。
私の環境ではexpat辺りやdocのコンパイルでエラーが起きたので、
Alternativeな方法でインストールした。

terminal
# ソースのダウンロード
$ curl -LO https://github.com/git/git/archive/v2.26.0.tar.gz

# 展開して展開先に移動
$ tar -xvf v2.26.0.tar.gz
$ cd git-2.26.0/

# configureファイルを作成して、configureする。インストール先は展開したディレクトリ
$ make configure
$ ./configure --prefix=$(pwd)

# makeしてinstall
$ make all
$ make install

# installしたgitのversion確認。
$ bin/git --version
git version 2.26.0

参考:
https://qiita.com/347lionz/items/a18c5b11df45a7c2e67d 

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

Squashを使わずにコミットログをまとめる方法

Gitを使っていると、ローカルブランチで作業することが多い関係上、コミットログを整理したいことがよくあります。

通常はマスターブランチ等にマージする際にSquash mergeを使えばよいのですが、GitLabのバージョンなどによってはマージリクエスト時にSquash merge非対応のケースがあります。
また、Hook Scriptの都合などでレビュー前にログをまとめたいケースもあるでしょう。

その場合、Squash用のローカルブランチを作って、そこでログを整理した後にマスターブランチにMergeするという少々手間な方法をとらなければなりませんでした。

しかしながらTortoiseGitを使って、もっと簡単にログをまとめる方法がありますので、紹介します。
*コミット間でConflictが起こっていないケースを想定しています。

  1. ログウィンドウを開き、まとめたいログをCtrlキーを押しながら複数選択します。
    image.png

  2. 右クリックを押して、「Combine to one commit」(英語)
    (これが表示されない場合は、競合が発生したりしてまとめられないログになります)
    image.png

  3. コミット画面になるので、コミットログを記入します。

  4. 結果をコミットして、Pushします。

これで、ログをまとめられます。
ローカルで簡単にできますので、活用してみてください。

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

gitの雑多メモ

結構gitにも慣れてきたけどそろそろqiitaに自分用にまとめてみる。
脳死でも読めるようにまとめます。

gitとはなにか?

分散型バージョン管理システム。wiki見よう。
https://ja.wikipedia.org/wiki/Git

最近の環境構築
mac環境
https://qiita.com/Chita_s0le/items/cdb9dd0af679845768e1

gitコマンド

git clone [gitHubからもってきたURL]
gitリポジトリからローカルにダウンロードするやつ

git pull = git fetch + git merge
最新のものをローカルリポジトリの今のブランチに落とす作業、基本的にはpullでいい

git checkout [移動したいbranchName]
移動したいブランチに移動するコマンド

git checkout -b [branchName]
現在いるブランチを元にして新たなブランチを切り分ける

git add .
ステージングに変更を上げる

git commit -m "コミットする時のコメント"
上がった変更点をコミットする

git push -u origin [branchName]
リモートリポジトリの同じブランチに上げる

git stash
今変更してるやつコミットしないけど他ブランチに移動したい!ってときにエラー出たらとりあえずこれ。
git stash pop すれば元に戻る。

develop(branchの元)に変更があった場合
git checkout develop
git pull
git checkout [いじったbranchName]
git rebase develop → gitの歴史がぐちゃぐちゃにならないようにするやつで便利
で、conflictの解消してpush

GitHub

https://github.co.jp/

GitLab

https://about.gitlab.com/

使ってきて

gitLabめちゃめちゃ楽。

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

macOS環境構築雑多メモ

macの最近の環境構築。winもほぼ変わらないと思うのでURL見つけておこう。

  • homebrew
  • git
  • nodebrew
  • npm

インストール内容

homebrew

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

...
  ==> The Xcode Command Line Tools will be installed.

  Press RETURN to continue or any other key to abort

RETURNしてpassword入力

  Already up-to-date.
  ==> Installation successful!

git

$ brew install git

参考にしたサイト
https://qiita.com/micheleno13/items/133aee005ae37c28960e

nodebrew

$ brew install nodebrew

参考にしたサイト
https://qiita.com/mame_daifuku/items/373daf5f49ee585ea498

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

AWS Lambdaでgitコマンドを使う

AWS Lambdaでgitコマンドを使う

AWS Lambdaでgitコマンドを使いたい場合があります。
githubのAPIを呼んだり、dulwichを使ってもいいのですが、新しく勉強するよりは、できれば、いつもの使い慣れたgitコマンドを使いたいものです。

使う物

AWS Lambda用にコマンドとライブラリをいい感じにまとめてくれるDockerコンテナ
https://hub.docker.com/r/qualitiaco/lambda-build-pack

gitコマンドとライブラリを抽出

gitコマンドを取り出すスクリプト

src/build.sh
#!/bin/sh
yum install -y git
cp -a /usr/bin/git ${OUTPUT_PATH}
cp -a /usr/libexec/git-core/git-remote-https ${OUTPUT_PATH}
cp -a /usr/libexec/git-core/git-remote-http ${OUTPUT_PATH}

yum でgitをインストールし(もしかしたら既に入っているかもしれませんが)、gitコマンド実行に必要な/usr/bin/gitとhttps通信に必要な、/usr/lib/exec/git-code/git-remote-http(s) を${OUTPUT_PATH}ディレクトリにコピーします。

この後のdockerコマンドが、${OUTPUT_PATH}にあるコマンドに必要なライブラリを自動的に抽出してくれます。

今回はyumで入れましたが、最新がよければ、gitこまんどをbuild.shスクリプト内でコンパイルしても構いません。

AWS Lambda環境用のgitコマンドとライブラリの取り出し

docker run -it --rm -v $(pwd)/src:/src -v $(pwd)/output:/output qualitiaco/lambda-build-pack

AWS Lambdaにアップロードする

Lambda Functionの作成

今回はPythonで作成してみます。
さっきできたoutputディレクトリの中に作成します。

output/lambda_function.py
import subprocess
import os
def lambda_handler(event, context):
    cwd = os.getcwd()
    os.chdir("/tmp")
    subprocess.call([
        os.path.join(cwd, "git"),
        f"--exec-path={cwd}",
        "clone",
        "https://github.com/qualitiaco/action-lambda-build-pack-sample.git"])
    print(open("/tmp/action-lambda-build-pack-sample/src/build.sh", "r").read())

githubのhttps://github.com/qualitiaco/action-lambda-build-pack-sample.git からgit cloneして、その中にあるsrc/build.shを出力するだけのプログラムです。

zipする

outputディレクトリの中から圧縮します。
シンボリックリンクを含みますので、「-y」オプションを忘れないよう付けてください。

cd output
zip -9yr ../lambda_function.zip *

確認

AWS Lambda Functionをあらかじめ作成してzipファイルをアップロードします。
少しサイズが大きいので、関数のソースコードをWebで確認することはできません。

実行すると、

lambda1.png

githubからgit cloneして取得したソースコードが表示されました。

終わりに

Dockerコンテナqualitiaco/lambda-build-packを使用してAWS Lambdaに必要なgitコマンドとライブラリを取得し、AWS Lambdaでgitコマンドを実行してみました。

本記事で使用したソースコードは、
https://github.com/qualitiaco/action-lambda-build-pack
にも置いてありますので、併せてご覧ください。

*本記事は @qualitia_cdevの中の一人、@hirachanさんに作成して頂きました。

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

# bash で __git_ps1 を使うときの注意点

__git_ps1 と 改行の食い合わせを気をつけないとお腹壊す

僕は昔から PS1によく

.bashrc
export PS1="\n [\W]\n"

などのように ダブルコーテーションと \n を使うけど これが行けない。
シングルコーテーション と 改行は '$'\n を であるべきだった。

.bashrc
source ~/.git-prompt.sh
export GIT_PS1_SHOWUPSTREAM=1
export GIT_PS1_SHOWUNTRACKEDFILES=1
export GIT_PS1_SHOWDIRTYSTATE=1
export PS1=''$'\n [ \w ]  $(__git_ps1)  '$'\n$ '

理由は、追っかけてないのでわからない。

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