- 投稿日:2021-01-29T22:59:33+09:00
git submodule updateでcloneできないときの対処方法
サブモジュールのあるリポジトリでサブモジュールをcloneしてくる場合は以下の様なコマンドを打つかと思います。
git submodule update --initただ、権限不足等で途中で失敗し、権限不足を解消してもう一度上記のコマンドを打ってもcloneしてくれないことがあります。
そんなときは、以下のコマンドを打つと解消されることがあります。
git pull --recurse-submodules git submodule foreach --recursive git reset --hard
- 投稿日:2021-01-29T20:40:25+09:00
gitignore系メモ
gitignore系メモ
配置する階層
.git以下ならどこでもいい。複数の.gitigoreファイルを配置できる。その場合、最下層のgitignoreの設定が優先される
書き方
階層
ファイル階層a/-| |- apl/-| |-aplhoge.txt |-hogedir/ |- hoge.txt |- .gitignore特定のファイルを対象外にしたい
.gitignore/hoge.txt /apl/hogedir特定のファイルだけ対象にしたい
.gitignore#階層関係なく全てのファイルを対象外にする * #apl/を対象外から外す !/apl #apl/以下のファイルを再帰的に対象外から外す。ワイルドカード1個だと、直下のみ対象外から外し、hogedir以下は対象外のまま。 !/apl/** #Makefile通過 !/Makefile
- 投稿日:2021-01-29T20:18:36+09:00
git取り消し系メモ
git取り消し系メモ
最新コミットに戻す(変更箇所全削除)
git reset --hard HEADHEAD…最新のエイリアス
HEAD^…最新の1個前のエイリアス最新コミットに戻す(変更箇所は削除しない。addしてない状態に戻る)
addの取り消しにも使える
git reset --mixed HEAD指定のコミット時点に戻す
git reset --hard 指定のハッシュ値指定のコミット時点を上書きコミット(戻らない)
git revert 指定のハッシュ値コミットの上書き
コミットメッセージやり直したい時など
git commit --amendadd(ステージング)したものを編集はそのままにaddを取り消し
git reset --mixed HEADaddしたものを最新コミットに戻す(編集分は消える)
git reset --hard HEAD
- 投稿日:2021-01-29T16:12:34+09:00
git stashで変更を退避
はじめに
git stash
コマンドについて学んだので忘備録git stashの使い所
「とあるブランチで作業中だけど、上司に急ぎの仕事を振られた。
作業が中途半端だからコミットはしたくない」そんな時に使えるのが
stash
コマンド
stash
はコミットしてない変更を退避することが出来る。
もちろん退避させていた変更を戻して作業を再開することも出来る。変更を退避させる
$ git stash save #saveは省略できるわかりやすいようにコメントを入れる事も出来る
$ git stash save "index.html編集中"退避した作業の一覧を見る
$ git stash list stash@{0}: On stash-lesson: index.html編集中
stashの名前
: onブランチ名
:コメント
退避した作業の詳細を見る
$ git stash show stash@{0} -p diff --git a/index.html b/index.html index 39b11d7..edb36ba 100644 --- a/index.html +++ b/index.html @@ -3,6 +3,8 @@ <meta name="description" content="gitレクチャー"> <title>gitレクチャー</title> <body> + <h1>git stashとは</h1> + <p>git stashはコミットしたくない変更を、</p> <script type="text/javascript" src="./app.js"></script> </body> </html>退避した作業を戻す
$ git stash pop退避した作業を消す
$ git stash drop stash@{0}
- 投稿日:2021-01-29T13:20:31+09:00
WindowsでGit サーバーを建てる。
需要が増えそうなので雑に書きます。
サーバー・クライアント共通
Git for Windowsをダウンロードします。
インストールはほぼデフォルトの設定で問題ないですが、
Configuring the line ending conversions に関しては
- Checkout as-is, commit as-is
に設定してください。OSを跨ぐと改行文字が死にます。
サーバー側でGit の設定
<>内は適宜置き換えてください。
コンソールで以下のコマンドの実行# ユーザー設定 git config --global user.email "<メールアドレス>" git config --global user.name "<ユーザー名>" # push 時にコンソールがハングするときは以下を設定 git config --global sendpack.sideband false #Git デーモンの起動(外部接続用) git daemon --verbose --export-all --base-path=<ファイルパス> (--enable=receive-packをつけると認証無しでGitの操作ができる)クライアント側でGit の設定
# ユーザー設定 git config --global user.email "<メールアドレス>" git config --global user.name "<ユーザー名>" # push 時にコンソールがハングするときは以下を設定 git config --global sendpack.sideband falseこれで適当にサーバーにリポジトリを作って
git clone git://<サーバーIP>/<設定したファイルパス以下>を実行すればクローンできると思います。
出来なかったら、ファイアウォールとウイルス対策ソフトのport : 9418(TCP)を確認してください。
許可していないと送受信できません。
追記:9418はGit protocolが使用するものなので、sshやhttpの人はしなくても問題ないです。
- 投稿日:2021-01-29T11:31:56+09:00
GASに入門して, Claspを使ったGit管理+Gitlab-CIを使ったCI / CDまでやった記録
GASに入門して, Claspを使ったGit管理+Gitlab-CIを使ったCDまでやってみた
今冬、初めて雪が窓の外をちらついた日のことだ。
開発部署に所属してこそいないものの、GASを使って業務の自動化をする仕事をしている人が、保守性・メンテナンス性が悪くて困っているという話をしていた。
「バージョン管理をしたらいいよ」というアドバイスが方々から飛んだ。私もそのアドバイスをしたうちの一人だった。そのとき、私はGASを触ったことが一度もなかった。
それから30分後、私はなぜかGASを触ることになっていた。何の偶然か、私はこのタイミングで突然ドライブの特定のディレクトリに存在する全てのスプレッドシートからあるカラムを取得する必要性に迫られたのだ。GASに入門する
私はGASとは何かを検索したのちに、まずは適当なスプレッドシートを作成し、その上に初めてのGASを作成した。
エディタは簡単に開いた。作成したスプレッドシート上でTools -> Script editorとクリックするだけだった。エディタ上には、
Code.gs
という謎の拡張子のファイルに空の関数が用意されていた。私はおもむろに入門サイトからハローワールドをコピペする。function myFunction() { Logger.log('Hello, GAS') }
Run
をクリックすると、画面下に実行ログが表示された。輝かしいこのコードこそ、私の初めてのGASコードである。
これで「GASも触ったことがないだなんて」と後ろ指を指される人生とはおさらばだ。1もう少し実用的な例を実装してみよう。スプレッドシートを新たに作成してみたい。
調べたところ、スプレッドシートに値をまとめて入れるには、二次元配列が便利なようだ。
何かちょうどいい二次元配列はないかと脳内にスキャンをかけると、引っかかったのは私のお気に入りのアイドルグループだった。/** * @returns {string} spreadsheetId */ function generateFavoriteIdols() { const spreadSheet = SpreadsheetApp.create('faborite-idols') const idols = [ // Lengths of all arrays have to match. ['Joshima', 'Kokubun', 'Matsuoka', 'Nagase', ''], // TOKIO ['Ohno', 'Matsumoto', 'Aiba', 'Ninomiya', 'Sakurai'], // Arashi ] spreadSheet.getActiveSheet().getRange(1, 1, 2, 5).setValues(idols) return spreadSheet.getId() }ついでに、生成したスプレッドシートからアイドルの名前を読み取る関数も書いてみよう。
これができれば、私が業務で求められていた仕事はこなせることだろう。/** * @param {string} spreadSheetId * @returns {string[][]} */ function readFavoriteIdols(spreadSheetId) { const spreadsheet = SpreadsheetApp.openById(spreadSheetId) return spreadsheet.getActiveSheet().getRange(1, 1, 2, 5).getValues() .map(l => l.map(e => String(e))) }Claspを使ってGit管理する
仕事は済んだ。しかし私の胸には、一時間前に無責任にも放った「Gitでバージョン管理するといいよ」という自らの言葉がいつまでも刺さっていた。
私はブラウザを開いて、「どうかいい感じの何かが出てくれ」というぼやっとした祈りと共に、検索欄に「gas git 管理」と入力した。無事にいくつかの検索結果を得た私は、Claspを使って先ほど作ったコードをGit管理することにした。
Claspのインストールと事前準備は下の記事を参考にした。claspでGASのソースをGit管理
https://qiita.com/zaki-lknr/items/b4954c222c1c1db92cafさっそく先ほどまで触っていたスクリプトエディタのURLからIDっぽいところをコピペしてきて
clasp clone
してみると、無事コードをローカルに引っ張ってくることができた。$ mkdir gas-sample && cd $_ gas-sample$ clasp clone *** Warning: files in subfolder are not accounted for unless you set a '.claspignore' file. Cloned 2 files. └─ appsscript.json └─ Code.js Not ignored files: └─ Code.js └─ appsscript.json Ignored files: └─ .clasp.json
.gs
だった拡張子が、.js
になっている。これは触れてやらないのが気遣いというやつだったかもしれない。いくつかのファイルを落とせたら、次はこれをgitで管理する。
ユーザ名とメールアドレスは何でもいいが、自分のものを使うのが無難だ。gas-sample$ git init gas-sample$ git config user.email 'me@example.com' gas-sample$ git config user.name 'me' gas-sample$ git add appsscript.json Code.js gas-sample$ git commit -m 'initial commit'ところで、
.clasp.json
の中を見たところ、私が先ほどclasp clone
するときに使ったスクリプトIDが書いてあった。
これはCDの中で設定した方が後々便利そうなので、ここではGit管理しないことにした。clasp.json{"scriptId":"***"}ここまででバージョン管理システムの導入が完了した。私の胸は歓喜に打ち震えている。
バージョン管理システムを導入したからには、何か修正を入れてみたい。私はもう一つアイドルグループを追加することを思いついた。
const idols = [ // Lengths of all arrays have to match. ['Joshima', 'Kokubun', 'Matsuoka', 'Nagase', ''], // TOKIO ['Ohno', 'Matsumoto', 'Aiba', 'Ninomiya', 'Sakurai'], // Arashi + ['', '', '', '', ''], // SMAP ] - spreadSheet.getActiveSheet().getRange(1, 1, 2, 5).setValues(idols) + spreadSheet.getActiveSheet().getRange(1, 1, 3, 5).setValues(idols) return spreadSheet.getId()const spreadsheet = SpreadsheetApp.openById(spreadSheetId) - return spreadsheet.getActiveSheet().getRange(1, 1, 2, 5).getValues() + return spreadsheet.getActiveSheet().getRange(1, 1, 3, 5).getValues() .map(l => l.map(e => String(e)))できた。
さっそくこの修正をGitに入れて、デプロイしてみよう。gas-sample$ git add Code.js gas-sample$ git commit -m 'Add SMAP to idols' gas-sample$ clasp pushはやる気持ちを抑えてブラウザでスクリプトエディタをリロードすると、無事修正が反映されていることが確認できた。
Gitlab CIを使って自動でデプロイする
人は、バージョン管理ができるようになったら、次はCI / CDを回したくなるものだ。
私も一人の矮小な人間にすぎないということだろう。次の瞬間、私はGitlabを開き、新たにリポジトリを作成していた。2GitlabでClone with SSLの横に書かれたURLをコピーし、これをローカルのリポジトリで
origin
という名前に関連付ける。
masterブランチをoriginのmasterブランチに対してpushすれば、Gitlabが私のコードを管理してくれるようになる。gas-sample$ git remote add origin git@gitlab.com:me/gas-sample.git gas-sample$ git push -u origin masterところで、Gitlabでは
.gitlab-ci.yml
というファイルをコミットすると自動的にCI / CDを回してくれるようになる。
つまり、.gitlab-ci.yml
というファイルを作り、そこにclasp push
を実行するよう書くだけで、Gitlabに対してgit push
するとGASが自動的に更新されるようになるのだ。とりあえず
clasp push
するだけの.gitlab-ci.yml
を書こう。
認可情報とデプロイ先のスクリプトIDを環境変数へ逃がしたため、予めGitlabのリポジトリの設定 -> CI/CD -> Variablesに認可情報をCLASPRC_JSON
, スクリプトIDをSCRIPT_ID
として入力することが必要だ。3.gitlab-ci.ymlstages: - upload upload: stage: upload image: node:10.23.2-alpine3.11 script: # Never hard-code .clasprc.json, EVER - cp $CLASPRC_JSON ~/.clasprc.json - echo "{\"scriptId\":\"${SCRIPT_ID}\"}" > .clasp.json - npx @google/clasp push特に、認可情報(
~/.clasprc.json
)の流出には気を付けなければならない。これは決してGitで管理してはならない情報だ。~/.clasprc.json
がログなど見えるところに残っていることに気がついたら、すぐにトークンを無効化しよう。Apps with access to your account
https://myaccount.google.com/permissions?pli=1これでCI / CDを実現することができる。
さっそくpushして、Gitlab上でパイプラインが流れるのを見てみよう。gas-sample$ git add .gitlab-ci.yml gas-sample$ git commit -m 'add .gitlab-ci.yml' gas-sample$ git pushGitlab CIの実行ログには、"Job succeeded"の美しい文字が並ぶ。
これでGitlabにpushするだけで全てが完結するようになった。Executing "step_script" stage of the job script 00:22 $ cp $CLASPRC_JSON ~/.clasprc.json $ echo "{\"scriptId\":\"${SCRIPT_ID}\"}" > .clasp.json $ npx @google/clasp push npx: installed 160 in 16.186s └─ Code.js └─ appsscript.json Pushed 2 files. Cleaning up file based variables 00:00 Job succeededここまでくれば、unittestの自動実行やAltJSを使った開発だって簡単だ。
あの微妙に使い勝手の良いスクリプトエディタへの未練を捨て去り、普段使っているIntellij ideaやVSCodeで開発をしてもいいのだ。もちろんvimやemacsを使ってもいい。最後に、Gitlab-CIの環境変数のオーバーライドを利用して、別のスクリプトIDに対してデプロイを試してこの記事を終わりにしよう。
これができれば、開発環境・本番環境の切り替えができるだろう。新たにスプレッドシートを作り、Tools -> Script editorをクリックする。URLのIDっぽいところを控えておく。
Gitlabに行き、ロケットのアイコンからPipelinesを開いて、Run Pipeline
をクリックする。
VariablesにSCRIPT_ID
をvariable key, 控えておいたScriptIdをvariable valueとして、Run Pipeline
をクリックする。
緑色のチェックとpassedという文字を深い満足をもって確認する。スクリプトエディタをリロードすると、真っ白だったエディタの中には、先ほど作成したお気に入りのアイドルグループ表を作成するスクリプトが表示されていた。
- 投稿日:2021-01-29T10:58:42+09:00
【git】terminalにbranch名を常に表示する設定
背景
git使ってると自分が今どのbranhにいるんだっけ?っと良くなる。
たまにdevelopで開発してたと思ったら、masterのままだったとか良くある。
branch名をterminalに表示しておけば間違えないよって言われた。
よくそんな事知ってるな~
設定
gedit ~/.bashrc
以下のおまじないを加える
GIT_PS1_SHOWDIRTYSTATE=true export PS1='\[\033[32m\]\u@\h\[\033[00m\]:\[\033[34m\]\w\[\033[31m\]$(__git_ps1)\[\033[00m\]\n\$ 'source ~/.bashrc