- 投稿日:2020-04-06T23:29:30+09:00
【Git】ベアリポジトリとノンベアリポジトリ
ベアとノンベアの違い
今回はリポジトリの概念であるベアとノンベアについて説明して行きます。
ベアリポジトリ
ワーキングディレクトリを持たない、Gitの更新情報だけを持っているリポジトリ。
ノンベアリポジトリ
ワーキングディレクトリを持つリポジトリ。
つまりベアリポジトリは作業用のフォルダやファイルなどの情報を持つ物で、ノンベアリポジトリはGitの更新管理をするための物ということになります。
ベアリポジトリとノンベアリポジトリの仕組み
ベアリポジトリ集中管理型
ベアとノンベアの仕組みは上記の画像の通り、ローカルからのプッシュは全てリモートのベアリポジトリに対して行い、その後ノンベアリポジトリがベアリポジトリからプルして情報を更新するという仕組みみたいです。ノンベアリポジトリ管理型
作業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
- 投稿日:2020-04-06T22:26:20+09:00
Github(Git) 入門
はじめに
春ですね,ご入社,ご入学おめでとうございます.この時期にGithub入門する人も多いと思います.この記事はせっかく社内ドキュメント作るのなら共有しちゃおうというものです.特有の言い回しなどはかみ砕いて説明するので,多少の相違は了承ください.
なぜ必要? クラウドストレージと何が違うの?
更新の時系列がわからないディレクトリがあなたのパソコンにはありませんか? 版を管理することをバージョン管理といいますが,ソフトウェア開発,デザイン,文筆などあらゆることでバージョン管理は煩わしいものです.更にチームになるとこのようなファイルがクラウドストレージにあったら,チームメンバーは混乱してしまいます.個人でもチームでもこんなことに時間をさきたくないはずです.
この煩わしさからGitは開放させてくれます.Gitは時系列順に版をスナップショットとして管理するバージョン管理システムです.Gitにcommitすることによって版が作成され更新されます.もとに戻したければ戻せますし,別バージョンを作りたければbranchを切ることによってできます.GitとGithub
Githubはバージョン管理システム(ソフトウェア)であるGitをクラウドサービスとして使えるようにしたもので,現在はMicrosoftによって運営されています.同等のサービスやソフトウェアとしてBitbucketやGitLabなどのプロジェクトがあります.
Gitはサーバークライアントとローカルクライアントが存在し,サーバーの方をサーバーに,ローカルをパソコンにインストールすることで使用します.Gitをサーバーにインストールすることによってバージョン管理サーバーとして,チーム内で共有することができるわけです.
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
します.
1.レポジトリを作る
まずプロジェクトを始めるにあたってリモートレポジトリであるGithubにレポジトリを作成します.本来はレポジトリを作る場合,
zsh$ mkdir hoge #ディレクトリの作成 $ git init #gitの初期化(.gitの作成) $ touch readme.md #説明書の作成 $ touch LICENSE #Licenseファイルの作成を実行する必要がありますが,Githubではレポジトリを作ると自動で,git initを実行してreadme.mdやLICENSE,.gitを作成してくれます.
試しにhogeレポジトリを作ります.2.clone
リモートレポジトリにあるレポジトリをローカルにダウンロードすることをcloneといいます.cloneするには任意の場所で,
$ git clone <hoge url or git>を実行します.ダウンロードされたhogeは一見readme.mdとLICENSEだけですが,きちんと.gitが含まれています.
Githubではこのcloneコマンドの他に,右上の緑色のボタンからzip形式でcloneすることもできます.プロジェクトメンバーで開発に参加していない人でも最新のzipを手軽にダウンロードすることが可能です.
3.add
cloneした状態に新しいファイルを作成したならばaddが必要です.addはあたらしいファイルを管理リストに追加することです.これでファイルの変更を追従できるようになります.
zsh$ git add -Aどのファイルが追加されていないかなどは
zsh$ git status
で確認できます.
追従していないファイルが表示されている.
addをすることで追従される.4.commit
既存のファイルを編集したときや,新しいファイルをaddしたときにはcommitをします.commitをすることで新しい版(バージョン)が作成されます.
どこまでやったらcommitするかは自由ですが,戻せない変更をする場合は,する前にかならずcommitします.セーブポイントできちんとセーブをしておけば,ラスボスで負けても再挑戦ができるわけです.commitには何を変更したかcommit messageを添えます.
zsh$ git commit -am "example commit"またcommitした変更はコミット履歴という形で履歴に残ります.
zsh$ git log
5. push
commitはローカルストレージのプロジェクトディレクトリ内の.gitに記録されます.この情報をスナップショットと一緒にアップロードすることをpushといいます.
pushを行うことでリモートレポジトリを更新し最新にします.チームメンバーはgit pullをすることで,常に最新版を使うことができます.zsh$ git push origin master #masterブランチにpush $ git pullチーム開発の場合,大抵はmasterブランチにはpushをせずにそれぞれのバージョンのブランチにpushし,それをmergeすることでmasterを最新に保ちます.これはバグなどの影響を最小限に留めるためです.
GUIソフト
Sourcetreeなどを使えばterminalではなく視覚的なソフトからでもGitを操作することができます.
以上,いちばん基本的なGit及びGithubの使い方でした.
参考
- 投稿日:2020-04-06T20:51:33+09:00
[個人開発]GoogleSpreadSheetをgit管理のような事をする!とっても愚かなCSVコンテンツトラッカー 「sit」
はじめに
gitコマンドの管理をGoogleSpreadSheetでした人はいても、GoogleSpreadSheet自体のgit管理はよく問題にされては今まで諦められてきました。
「GoogleSpreadSheetをgit管理するのは無理なんじゃないか」
たしかに無理です。(断定していいのか?...む、無理だよね?)
しかし、git管理に近い事はできるという事をこの記事で示したいと思います。これから紹介するコマンドは完全ではないものの、ちょっと希望を感じれるそんなコマンドです。
その名は
sit
です。対象読者
- GoogleSpreadSheetの魔改造に興味がある人
- おもちゃCLI大好きな人
- 何か新しい刺激をもとめている人
What is sit?
sit
は非常に非常に愚かなcsvコンテンツトラッカーです。gitのようにGoogleSpreadSheetCSVデータを管理したいという考えから生まれました。だから、sit
はgit
に非常に似ています。sit
という名前はsheet git
に由来します。ですが違いがあります。git
はgit
コマンドだけで完結できますが、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/sitInitialize 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にアクセスし、サービスアカウントを発行します。
次に、認証ファイルをcreds.jsonとしてダウンロードします。
もし正しくダウンロードできれば
sit-tutorial
のディレクトリは以下のようになってます。これでGoogleSpreadSheetにアクセスできるようになったといいたいのですが、実はもうちょい設定が必要です。
続きはCreate Remote Repository
で説明します。?Google Sheets APIが有効になっている事を確認してください
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.name
とuser.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.comCreate 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を取得します。この例では以下のような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
GASスクリプトがちゃんと設定されていることがわかります。
Setting Sheet Sharing
ダウンロードした
creds.json
に書かれたclient_email
のメールアドレスを使って共有設定を行います。これで
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
正しく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
Fetch and Merge from GoogleSpreadSheet
今、 GoogleSpreadSheetの
develop
ブランチがmaster
ブランチにマージされて以下のような状態になったとします。?残念ながら、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/masterfetchしてきた内容を確認してみましょう。
$ 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.hellofetchに確かに成功していることが確認できました。
それでは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
を手動で変更したとします。この状態で
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でマージを行っているのでコンフリクトは起きやすくなってます。この状態でのマージの様子を見てみましょう。
$ 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.元にもどりました。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
をしてみてください。$ sit merge --continue hint: Waiting for your editor to close the file...起動したファイルを閉じ、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
してみましょう。$ sit stash save Saved working directory and index state WIP on master: 5fe2e48 Merge remote-tracking branch 'origin/master'
stash
した結果の詳細を確認してみましょう。dist/master_data.csv
ファイルを確認してみましょう。$ 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
develop
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
という名前でシートが作られていると思います。?
[pr]
で始まるシート(ブランチ)名は、プルリクエスト用に予約されているため、ブランチ名として使用できません。他のシートと違いフッターがあると思います。それについて説明します。
name description created at
作成日時 reviewers
レビュワー assignees
PRを作成した人 message
PRの内容を簡潔に書く labels
自由に活用してください projects
自由に活用してください milestone
自由に活用してください 少なくとも
reviewrs
・message
はかくべきだと考えます。次に、[ステータス]列について説明します。 [ステータス]列では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)を自動で作成するようにやってみようと思う。
- 投稿日:2020-04-06T20:51:33+09:00
[個人開発]GoogleSpreadSheetをgit管理っぽいような事をする!とっても愚かなCSVコンテンツトラッカー 「sit」
はじめに
gitコマンドの管理をGoogleSpreadSheetでした人はいても、GoogleSpreadSheet自体のgit管理はよく問題にされては今まで諦められてきました。
「GoogleSpreadSheetをgit管理するのは無理なんじゃないか」
たしかに無理です。(断定していいのか?...む、無理だよね?)
しかし、git管理に近い事はできるという事をこの記事で示したいと思います。これから紹介するコマンドは完全ではないものの、ちょっと希望を感じれるそんなコマンドです。
その名は
sit
です。対象読者
- コロナ自粛で暇な人
- GoogleSpreadSheetの魔改造に興味がある人
- おもちゃCLI大好きな人
What is sit?
sit
は非常に非常に愚かなcsvコンテンツトラッカーです。gitのようにGoogleSpreadSheetCSVデータを管理したいという考えから生まれました。だから、sit
はgit
に非常に似ています。sit
という名前はsheet git
に由来します。ですが違いがあります。git
はgit
コマンドだけで完結できますが、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/sitInitialize 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にアクセスし、サービスアカウントを発行します。
次に、認証ファイルをcreds.jsonとしてダウンロードします。
もし正しくダウンロードできれば
sit-tutorial
のディレクトリは以下のようになってます。これでGoogleSpreadSheetにアクセスできるようになったといいたいのですが、実はもうちょい設定が必要です。
続きはCreate Remote Repository
で説明します。?Google Sheets APIが有効になっている事を確認してください
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.name
とuser.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.comCreate 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を取得します。この例では以下のような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
GASスクリプトがちゃんと設定されていることがわかります。
Setting Sheet Sharing
ダウンロードした
creds.json
に書かれたclient_email
のメールアドレスを使って共有設定を行います。これで
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
正しく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
Fetch and Merge from GoogleSpreadSheet
今、 GoogleSpreadSheetの
develop
ブランチがmaster
ブランチにマージされて以下のような状態になったとします。?残念ながら、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/masterfetchしてきた内容を確認してみましょう。
$ 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.hellofetchに確かに成功していることが確認できました。
それでは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
を手動で変更したとします。この状態で
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でマージを行っているのでコンフリクトは起きやすくなってます。この状態でのマージの様子を見てみましょう。
$ 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.元にもどりました。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
をしてみてください。$ sit merge --continue hint: Waiting for your editor to close the file...起動したファイルを閉じ、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
してみましょう。$ sit stash save Saved working directory and index state WIP on master: 5fe2e48 Merge remote-tracking branch 'origin/master'
stash
した結果の詳細を確認してみましょう。dist/master_data.csv
ファイルを確認してみましょう。$ 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
develop
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
という名前でシートが作られていると思います。?
[pr]
で始まるシート(ブランチ)名は、プルリクエスト用に予約されているため、ブランチ名として使用できません。他のシートと違いフッターがあると思います。それについて説明します。
name description created at
作成日時 reviewers
レビュワー assignees
PRを作成した人 message
PRの内容を簡潔に書く labels
自由に活用してください projects
自由に活用してください milestone
自由に活用してください 少なくとも
reviewrs
・message
はかくべきだと考えます。次に、[ステータス]列について説明します。 [ステータス]列では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)を自動で作成するようにやってみようと思う。会社都合でもうそのプロジェクト外されたけど....
- 投稿日:2020-04-06T17:40:03+09:00
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
- 投稿日:2020-04-06T16:54:46+09:00
Squashを使わずにコミットログをまとめる方法
Gitを使っていると、ローカルブランチで作業することが多い関係上、コミットログを整理したいことがよくあります。
通常はマスターブランチ等にマージする際にSquash mergeを使えばよいのですが、GitLabのバージョンなどによってはマージリクエスト時にSquash merge非対応のケースがあります。
また、Hook Scriptの都合などでレビュー前にログをまとめたいケースもあるでしょう。その場合、Squash用のローカルブランチを作って、そこでログを整理した後にマスターブランチにMergeするという少々手間な方法をとらなければなりませんでした。
しかしながらTortoiseGitを使って、もっと簡単にログをまとめる方法がありますので、紹介します。
*コミット間でConflictが起こっていないケースを想定しています。
右クリックを押して、「Combine to one commit」(英語)
(これが表示されない場合は、競合が発生したりしてまとめられないログになります)
コミット画面になるので、コミットログを記入します。
結果をコミットして、Pushします。
これで、ログをまとめられます。
ローカルで簡単にできますので、活用してみてください。
- 投稿日:2020-04-06T16:27:50+09:00
gitの雑多メモ
結構gitにも慣れてきたけどそろそろqiitaに自分用にまとめてみる。
脳死でも読めるようにまとめます。gitとはなにか?
分散型バージョン管理システム。wiki見よう。
https://ja.wikipedia.org/wiki/Git最近の環境構築
mac環境
https://qiita.com/Chita_s0le/items/cdb9dd0af679845768e1gitコマンド
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
GitLab
使ってきて
gitLabめちゃめちゃ楽。
- 投稿日:2020-04-06T16:16:20+09:00
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 abortRETURNしてpassword入力
Already up-to-date. ==> Installation successful!git
$ brew install git参考にしたサイト
https://qiita.com/micheleno13/items/133aee005ae37c28960enodebrew
$ brew install nodebrew参考にしたサイト
https://qiita.com/mame_daifuku/items/373daf5f49ee585ea498
- 投稿日:2020-04-06T09:27:33+09:00
AWS Lambdaでgitコマンドを使う
AWS Lambdaでgitコマンドを使う
AWS Lambdaでgitコマンドを使いたい場合があります。
githubのAPIを呼んだり、dulwichを使ってもいいのですが、新しく勉強するよりは、できれば、いつもの使い慣れたgitコマンドを使いたいものです。使う物
AWS Lambda用にコマンドとライブラリをいい感じにまとめてくれるDockerコンテナ
→ https://hub.docker.com/r/qualitiaco/lambda-build-packgitコマンドとライブラリを抽出
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-packAWS Lambdaにアップロードする
Lambda Functionの作成
今回はPythonで作成してみます。
さっきできたoutputディレクトリの中に作成します。output/lambda_function.pyimport 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で確認することはできません。実行すると、
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さんに作成して頂きました。
- 投稿日:2020-04-06T00:28:33+09:00
# bash で __git_ps1 を使うときの注意点
__git_ps1 と 改行の食い合わせを気をつけないとお腹壊す
僕は昔から PS1によく
.bashrcexport PS1="\n [\W]\n"などのように ダブルコーテーションと \n を使うけど これが行けない。
シングルコーテーション と 改行は '$'\n を であるべきだった。.bashrcsource ~/.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$ '理由は、追っかけてないのでわからない。