20210124のGitに関する記事は14件です。

Docker×Git×VSCodeを使ってElixirの開発を丁寧に始める

環境

  • Windows 10 Pro
  • Docker for Windows
    • Docker Engin (20.10.2)
    • docker-compose (1.27.4)
  • Git for Windows (2.30.0.windows.2)
  • Visual Studio Code (1.52.1)
    • 拡張機能
      • Docker
      • Japanese Language Pack for Visual Studio Code
      • Remote - Containers
      • ElixirLS

それぞれのインストールについては、Docker×Git×VSCodeの環境構築は多分これが一番やさしい説明だと思いますを参照。

やりたいことと注意点

やりたいこと

  1. DockerとVSCodeでElixirの開発環境を作る
  2. mixでElixirプロジェクトを作って動作確認する
  3. GitHubと連携してバージョン管理を行う

本記事では1,2,3の順番で説明。

注意点

本記事を読む際は以下の点に注意されたし。

  • 環境構築の手順とそのハマりポイントについて記載しているので、DockerやElixirなどについての詳しい記載を避けている
  • 画面のキャプチャを張り付けて説明している。アプリや拡張機能の仕様変更により記事掲載時と画面の内容が異なることがある
  • 本記事の手順は上記環境欄で記載した環境を用意していることを前提とする
  • 記事が長い

STEP1 DockerとVSCodeでElixirの開発環境を作る

1.VSCodeを起動して[ファイル]->[フォルダーを開く]を押下

image.png

 
2. 任意のフォルダを作成して、フォルダーの選択を押下(今回は「elixir_intro」のフォルダを作成)

image.png
 
3. エクスプローラーのところで右クリック->新しいファイルをクリック

image.png

 
4.新しく作成したファイルの名前を「Dockerfile」にして、以下の内容を記述

※ファイル名を「DockerFile」(fを大文字)にするとdocker-composeコマンドがエラーになるので注意(後述のハマりポイントを参照)

Dockerfile
FROM elixir:1.11.1

RUN mix local.hex --force && \
  mix archive.install hex phx_new 1.4.3 --force && \
  mix local.rebar --force

WORKDIR /app

 
5. 再度エクスプローラーのところで右クリック->新しいファイルをクリック

image.png

 
6.新しく作成したファイルの名前を「docker-compose.yml」にして、以下の内容を記述
 

docker-compose.yml
version: '3.2'
services:
  elixir:
    build: .
    volumes:
      - .:/app

 
7. VSCodeの左下のアイコンを選択(Remote - Containersの拡張機能が必要)

vs-code.png

 
8. 「Remote - Containers:Reopen in Container」を選択

image.png

 
9. 「From 'docker-compose.yml'」を選択

image.png

 
10. 左下に「Dev Container:Existing Docker Compose(...」と表示されたら成功

vs-code.png
 
11. VSCodeの拡張機能を有効化する。「Ctrl」+「Shift」+「X」キーを押下して拡張機能を表示して、「Dev Container:Existin1」を押下
※docker-compose(Docker)で接続したリモートコンテナ上でVSCodeが立ち上がっているので、拡張機能が無効化されている。

vs-code.png

ハマりポイント docker-composeコマンドがエラーになる(原因:Dockerfileのファイル名)

Dockerfileのファイル名を「DockerFile」(fが大文字)にした場合、以下のエラーが発生する。
原因は「~Cannot locate specified Dockerfile: Dockerfile'~」と記載されているように、
docker-compose実行時にCPythonが実行され、内部コードの辞書に存在する「Dockerfile」の文字列に合致しないため。

ファイル名を「Dockerfile」に変更すると解消する。

--------------------------中略--------------------------
[2021-01-24T00:14:09.868Z] [PID 18988]   File "compose\service.py", line 346, in ensure_image_exists
  File "compose\service.py", line 1147, in build
compose.service.BuildError: (<Service: elixir>, {'message': 'Cannot locate speci
fied Dockerfile: Dockerfile'})

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "docker-compose", line 3, in <module>
  File "compose\cli\main.py", line 78, in main
TypeError: can only concatenate str (not "dict") to str
[7012] Failed to execute script docker-compose

STEP2 mixでElixirプロジェクトを作って動作確認する

STEP1でコンテナにリモート接続し、VSCodeのターミナルで以下のコマンドを実行

root@:/workspace# mix new . --app elixir_intro     #カレントディレクトリに「elixir_intro」のアプリ名でPJを作成する

実行したら以下のディレクトリが構成される

.
├── .devcontainer
│   ├── devcontainer.json
│   └── docker-compose.yml
├── .elixir_ls
│   └── build
├── lib
│   └── elixir_intro.ex
├── test
│   ├── elixir_intro_test.exs
│   └── test_helper.exs
├── .formatter.exs
├── .gitignore
├── docker-compose.yml
├── Dockerfile
├── mix.exs
└── README.md

動作確認では、以下のElixirファイルをコンパイル・実行する。(プロジェクト作成時から訂正しているのでコピペすること)

lib/elixir_intro.ex
defmodule ElixirIntro do
  @moduledoc """
  Documentation for `ElixirIntro`.
  """

  @doc """
  Hello world.

  ## Examples

      iex> ElixirIntro.hello()
      :world

  """
  def main([]) do
    IO.puts "Hello World"
  end
end

動作確認① iexからプログラムを実行する場合

  1. VSCodeのターミナルで以下のコマンドを実行して、iexを起動
root@:/workspace# iex -S mix     # -Sオプションでインタラクションモード実行前にmixを実行する
Erlang/OTP 23 [erts-11.1.1] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [hipe]

Compiling 1 file (.ex)           # mixを実行したためにコンパイル実行
Generated elixir_intro app
Interactive Elixir (1.11.1) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> 

 
2. iexで以下を実行して動作確認

iex(1)> ElixirIntro.main([])
Hello World
:ok

動作確認② コマンドラインからmixを実行して動作確認

  1. VSCodeのターミナルで以下のコマンドを実行して、コンパイルを実行
root@:/workspace# mix compile
Compiling 1 file (.ex)            # -Sオプションでインタラクションモード実行前にmixを実行する
Generated elixir_intro app

 
2. 続いてVSCodeのターミナルで以下のコマンドを実行して動作確認

root@:/workspace# mix run -e "ElixirIntro.main([])"
Hello World

動作確認③ 実行可能ファイルを作成・実行して動作確認

  1. VSCodeのターミナルで以下のコマンドを実行して、実行可能ファイルを作成

実行後、ファイル名「elixir_intro」のファイルが作成される。

root@:/workspace# mix escript.build
Compiling 1 file (.ex)
Generated elixir_intro app
Generated escript elixir_intro with MIX_ENV=dev

 
2. 実行可能ファイルを実行して動作確認

root@:/workspace# ./elixir_intro 
Hello World

STEP3 GitHubと連携してバージョン管理を行う

前準備 Gitの初期設定

既に初期設定している場合は読み飛ばしてOK

※前提として、GitHubアカウントを作成していること

  1. Git Bashを実行してコマンドラインを起動(Git BashはWindows検索ボックスなどで検索して実行)
  2. ユーザー名の登録(GitHubアカウントのユーザー名)
$ git config --global user.name 'username'

 
3. アドレスの登録(GitHubアカウントのアドレス)

$ git config --global user.email 'username@example.com'

 
4. Gitのエディタとマージツールの設定をVSCodeに指定

$ git config --global core.editor 'code --wait'
$ git config --global merge.tool 'code --wait "$MERGED"'

 
5. pushの方式を指定(追跡ブランチに対してpush)

$ git config --global push.default simple

ローカルリポジトリの作成と変更内容のコミット

  1. ローカルリポジトリを初期化する。VSCodeで「Ctrl」+「Shift」+「G」キーを押下して、ソース管理画面のInitialize Repositoryを押下

vs-code.png
 
2. 変更内容を全てステージングする。画像の「+」マークを押下

vs-code.png
 
3. 変更内容を全てコミットする。①コミットメッセージを記載し、②レ点を押下

vs-code.png

リモートリポジトリの作成

  1. GitHub (https://github.com/) にアクセス、ログインして画面左上のNewを押下

vs-code.png
 
2. 「Repository name」を入力し、Create repositoryを押下

※今回はリポジトリ名を「elixir_intro」とし、Publicリポジトリにした(誰でもアクセス可能)
※READMEファイルや.gitignoreファイルはmixでプロジェクトを作成した時に作成されたので今回はチェックを外した。ライセンスは関係ないのでチェックを外した

vs-code.png
 
3. 画面に表示されたHTTPSのURLをコピーしておく(後にpushするときに必要)

vs-code.png

ローカルからリモートリポジトリへpushする

  1. リモートリポジトリを追加する。VSCodeで「Ctrl」+「Shift」+「G」キーを押下して、ソース管理画面の横三点リーダからAdd Remoteを押下

vs-code.png
 
2. テキストボックスにリモートリポジトリのHTTPS URLを入力

vs-code.png
 
3. テキストボックスにリモート名を入力(今回は「origin」と入力)

vs-code.png
 
4. ソース管理画面の横三点リーダからFetchを押下

vs-code.png
 
5. ソース管理画面の横三点リーダからPushを押下

vs-code.png
 
6. 「上流ブランチが無いので、このブランチをpublishするか?」と聞いてくるのでOKを押下

vs-code.png
 
7. GitHubでリモートリポジトリを確認すると、反映されている

image.png

以上で環境の構築は完了。

謝辞

今回は様々な記事を参考にさせて頂きました。
この場をお借りしてお礼申し上げます。


  1. Existing Docker Compose (Extend) 

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

git add -Aが効かない... [超初心者]

要約

git add -A

でうまくいかなかったことが

git add <リポジトリ名>

にするとうまくいったという話

つまりかけた部分

rails tutorialをやっていて、gitはgit add -Aをすればcommitできるでしょ、と漠然と思っていた

git add -A
error: 'リポジトリ名/' does not have a commit checked out
fatal: adding files failed

??
何故かaddできない

git addの仕様

https://note.nkmk.me/git-add-u-a-period/
git addのオプションはこちらのリンクがわかりやすい
https://qiita.com/stivan622/items/a5d0d651e5b59be00f0c

#ファイルをステージングに追加
git add <ファイル名>

#複数ファイルを追加
git add <ファイル名> <ファイル名> <ファイル名> <ファイル名>

#すべてのファイルを追加
git add .

結果

git add <ファイル名>

ここのファイル名をリポジトリ名として実行するとうまく行った
依存関係の問題もあるかもしれないけど今はわからない

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

きっとgit使えないとbad

はじめに

私は、プログラミングを始めた当初から、GitHub Desktopを使っていました。ですが、現場ではターミナルで操作することの方が多いと思うので、封印します。ターミナルで操作できるように少しずつコマンドを覚えていこうと思います。

今回は、いちばんよく使う、GitHub Desktopでいうところの、コミットからプッシュまでを紹介します。

コミットまで

% git add ファイル名
  • ファイル名はパスで指定する。
    ※app/views…みたいな感じ。
  • 複数のファイルを登録する場合は、ファイル名を半角スペースで開ける。
    ※同じフォルダ内なら、,で区切る。
  • 全ファイルを登録する場合は、
% git add -A
% git commit -"コミットメッセージ"

ここまでをGitHub Desktopでは、コミットメッセージを書いて、ワンクリックだったなぁ…
addの概念が無かった…

% git status

で状態を確認することができる。

リモートリポジトリにプッシュ

% git push

これも、GitHub Desktopでは、ワンクリックだったなぁ。

最後に

調べていると知らない概念がたくさんあって、もっと勉強しないといけないと思わされました。

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

【Git】ローカルブランチの変更を元に戻す

$ git checkout .

これで変更したものを元に戻すことができる。

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

ターミナルをカスタマイズする方法

はじめに

先日iTerm2を導入しました。
せっかくなのでこのタイミングでカスタマイズしてみたところ、結構いい感じになったのでその方法をシェアします。
Ese1MIlUUAMXMs-.jpeg

iTerm2をインストールする

下記リンク先からダウンロードできます。
https://iterm2.com

まずは見た目を変える

こちらを参考にしました。それでは1つずつ見ていきます。
https://gist.github.com/kevin-smets/8568070

oh-my-zshをインストールする

oh-my-zshは、zsh用の設定フレームワークです。
公式はこちらから→https://github.com/ohmyzsh/ohmyzsh

下記コマンドでインストールします。

sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

Powerlevel 10kを使用する

こちらは表示をカスタマイズするプラグインです。
公式はこちらから→https://github.com/romkatv/powerlevel10k

下記コマンドでクローンします。

git clone https://github.com/romkatv/powerlevel10k.git $ZSH_CUSTOM/themes/powerlevel10k

クローンしたら、zshの個人設定ファイルである.zshrcを開きます。

open ~/.zshrc

先ほどクローンしたPowerlevel 10kが使えるように書き換えます。

ZSH_THEME="powerlevel10k/powerlevel10k"

フォントをインストールする

このままだと表示が文字化けしていると思います。
解消するために下記リンク先からSource Code Pro for Powerlineというフォントをダウンロードします。
https://github.com/powerline/fonts/blob/master/SourceCodePro/Source%20Code%20Pro%20for%20Powerline.otf

ダウンロードが終わったら、下記リンク先にも記載されている通りインストールを進めます。
https://github.com/powerline/fonts

まずはクローンします。

git clone https://github.com/powerline/fonts.git --depth=1

インストールします。

cd fonts
./install.sh
cd ..
rm -rf fonts

iTerm2で設定する

iTerm2のPreferencesを開き、Profiles内のTextタブを開きます。
Fontを先ほどインストールしたSource Code Pro for Powerlineに変更します。
これで文字化けが直るはずです。
_2021-01-24_19.28.35.png
これは好みですが、Colorsタブ内のColor Presetsで色をSolarized Darkを選びました。
_2021-01-24_19.30.58.png
以上で見た目のセットアップは終了です。

コマンドの予測補完を表示する

zsh-autosuggestionsというプラグインを入れてコマンドの予測補完を表示できるようにしました。
https://github.com/zsh-users/zsh-autosuggestions

まずはクローンする。

git clone [https://github.com/zsh-users/zsh-autosuggestions](https://github.com/zsh-users/zsh-autosuggestions) $ZSH_CUSTOM/plugins/zsh-autosuggestions

次に、.zshrcにzsh-autosuggestionsを追記します。
私の場合、以下のようになりました。

plugins=(
    git
    zsh-autosuggestions
)

最後に設定を更新しておきます。

source ~/.zshrc

エイリアスを設定する

まずは毎回git push等のようにgit 〜と入力しなくてもいいようにエイリアスを設定します。
.zprofileを開き、下記を追記します。

alias g='git'

エイリアスを設定することで、下記のようにg 〜と省略することができるようになります。

g push

次に、よく使うgitコマンドについてもエイリアスを設定しておきます。
こちらについては.gitconfigに記載していきます。

[alias]
    co = checkout
    ps = push
    st = status
    br = branch

例えば、g pushと入力しなくても下記のようにさらに省略することができるようになります。

g ps

最後に

参考までに.gitconfigを公開しましたので、コピーしてお使いください。
https://github.com/n199603/dotfiles-public

以上、ターミナルをカスタマイズする方法でした。見ていただきありがとうございました。

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

会社用のgithubを作成した話

はじめに

実際の現場ってgithubのアカウントが用意されており、入社したらそこに招待してもらうみたいな感じがありますよね。

先日会社用のgithubのアカウントを作成しました。
今までは個人開発で個人のgithubアカウントは持っていたのですが
会社用のアカウントはどう作成するのか、どのプランがいいのかなどネットにも賛否両論だったのでここでまとめます!

ターゲット層

  • これから会社を作りgithubのアカウントを作成したい
  • 小さいコミュニティなどで使うアカウントが欲しい などなど

結論

いきなり結論からいうと
1. 代表者の個人のアカウントを作成
2. 個人のアカウントの中でorganizationを作成
3. プランを決定する
4. リポジトリを作成
5. メンバーを招待していく
といった流れになります!!

会社によって色々な方法をとっていますが、今回はこちらの方法で説明していきます

個人用のアカウントを作成

こちらは個人用のアカウントを持っていれば一度行っていると思いますが一緒に行っていきます!
https://github.com/
こちらのページにいきましょう!

まずはsignUpでアカウントを新規に作成します!
自分が代表の場合は自分の情報で、
代表以外が管理する場合もここは代表者の情報で個人アカウントを作成する方がいいと思います!!

ひとまずメール認証などありますが
名前、メールアドレス、パスワードを入れてアカウントを作成しましょう!

個人のアカウントでorganizationを作成

organizationは組織という意味です!
スクリーンショット 2021-01-24 19.11.11.png
ここからYour organizationsをクリックです!

次にnew organizationsをクリック
次にプランを決めます!

スクリーンショット 2021-01-24 19.13.18.png
3プランありますが、organizationsを作るのであれば
TeamかEnterpriseを選択しましょう!!

Enterpriceは会社なのでこっちかなと思った方。
プランはいつでもアップデート可能なので、まずはTeamプランをお勧めします!

Teamプランではメンバーを一人招待するごとに4$ってイメージです。
小規模なチーム開発ならこちらで十分だと思います。

あとは組織のorganizationsの名前を決めて、カード情報を入れれば作成は完了です!
作成したものはこちらで切り替えられます!

スクリーンショット 2021-01-24 19.17.22.png

またメニューからYour organizationsをクリックすると
スクリーンショット 2021-01-24 19.21.20.png
こちらのsettingsから色々設定ができます!!

スクリーンショット 2021-01-24 19.23.27.png

ちなみにBilling & plansなどで月々の支払いや領収書なども見れるようになっています!!

メンバーを招待する

organizationsの方でpeopleを開きましょう
そこのinvite memberで招待したい人のユーザー名、フルネーム、あるいはメールアドレスを入力して招待を送ります!
詳しくはこちらにhttps://docs.github.com/ja/github/setting-up-and-managing-organizations-and-teams/inviting-users-to-join-your-organization

これで完了です!!!
お疲れ様でした!!

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

macOS / Windows の Git 用に GnuPG (GPG) を準備する

macOS や Windows の Git でタグやコミットに署名できるように GnuPG (The GNU Privacy Guard) をインストールする手順や注意事項です。

実際に署名を付ける手順は以下などを参照ください。

macOS

前提

  • Homebrew が使えること
  • Git が使えること

インストール

GnpPG のインストール

brew install gnupg

pinentry-mac のインストール

GnuPG をインストールしただけでは、Git の CLI を直接使わずにコミットするときなど、秘密鍵を使うときのパスフレーズの入力に難があるので 1、 pinentry-mac を使うように構成します。

brew install pinentry-mac

インストール後に表示される以下のメッセージの通りに ~/.gnupg/gpg-agent.conf を作成します。

==> Caveats
You can now set this as your pinentry program like

~/.gnupg/gpg-agent.conf
    pinentry-program /usr/local/bin/pinentry-mac

以下のコマンドをそのまま実行すれば良いでしょう。

echo "pinentry-program /usr/local/bin/pinentry-mac" >> ~/.gnupg/gpg-agent.conf

これで、秘密鍵を使うときにパスフレーズの入力でウィンドウが表示されるようになります。

スクリーンショット 2020-12-27 19.34.59.png

期待したとおりに動かないとき

gpg-agent を停止してから試してみると良いかも。

gpgconf --kill gpg-agent

Windows

前提

  • Git for Windows が使えること

GnuPG のインストールについて

Git for Windows に GnuPG が付いているため、改めてインストールする必要はありません。 2 3

gpg コマンドの実行について

GPG キーペアの作成など、gpg コマンドは Git Bash 上で使います。

通常の状態では gpg コマンドは PowerShell やコマンドプロンプトから使えないので、普段これらのシェルから git コマンドを使っている場合は注意が必要です。 4


  1. MacVim by macvim-devtpope/vim-fugitive: fugitive.vim: A Git wrapper so awesome, it should be illegal:Gcommit を使うときにパスフレーズを入力出来ないなど。 

  2. choco install gnupg などとして GnuPG をインストールし、Git がこれを使うように git config で設定することもできるとは思いますが、.gitconfig のポータビリティがなくなるので私は諦めました。 

  3. Git for Windows 同梱版や Windows 以外の GnuPG で使用される ~/.gnupg ディレクトリが、Windows 用の GnuPG では %APPDATA%\gnupg になるなどの違いがあります。コマンドオプションや環境変数を設定して同じディレクトリを参照するようにもできますが、同じディレクトリを共用するとファイルのロック操作に不具合を生じるようです。 

  4. 環境変数 PATH を適切に設定すれば使えるようですが。 

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

[iOS] git pushでLintチェックを行う(Git Hooks + SwiftLint)

こんにちは。都内でiOSエンジニアをしている @zrn-ns です。

弊社のプロジェクトではSwiftLintを利用しており、最低限のコーディング規約についてはSwiftLintでチェックする事ができるようになっています。

SwiftLintはビルドフェーズに含めることも想定されており、公式のガイドに従うだけでビルド時にLintチェックを行い、規約に沿った記述を徹底させることができます。

しかし今回諸事情があり、ビルドフェーズではなく、Gitでリモートリポジトリにpushする直前でLintチェックを行うようにしてみました。

なぜビルドフェーズではなく、Push時にチェックするのか

ビルドフェーズで実行する方式だとビルド時に多少のオーバーヘッドが発生してしまいます(差分チェックを行ってくれるようなので、ほぼ気にならないレベルですが)。
また弊社社内ではXcode派AppCode派が存在します。AppCodeではSwiftLintのプラグインが存在するため、Lintチェックをビルドフェーズに含める方式だと、2重でLintチェックが行われてしまうことになります。

これらの問題を解消するため、ビルドフェーズでLintチェックを行うのをやめ、リモートリポジトリにコードをpushするタイミングでLintチェックを行うようにしてみました。

どうやってPush時に任意のスクリプトを実行するのか

Gitには、各アクション(commit, push, merge等)の実行の前後に任意のスクリプトを実行するためのGit Hooksという仕組みがあります。

Git Hooksでは、commitやpush, mergeの前後のタイミングで、各Gitリポジトリの.git/hooks/ディレクトリ下に配置したスクリプトが自動的に実行されます。
例えば、pushの直前でスクリプトを実行したい場合、.git/hooks/pre-pushというスクリプトが存在すれば、それが自動的に呼び出されます。

Git Hooksを利用して、push時にSwiftLintを実行する

今回はGit Hooksの設定を全メンバー間で共有できるようにし、全メンバーがpush前にLintチェックを行うことを強制できるようにします。

スクリプトの作成

.git/ ディレクトリ配下はgitで管理されない(コミットできない)ため、.git/hooks/pre-push にスクリプトを記述するとメンバー間で設定を共有することができません。

そこで、git管理下にGit Hooks用のスクリプトを入れておくための専用のディレクトリを作成し、そこに配置したpre-pushスクリプトを参照するようにgitの設定を変更します。

cd {プロジェクトディレクトリ}

# git hooksを入れるためのディレクトリとスクリプトを作成
mkdir .githooks
touch .githooks/pre-push

# スクリプトに実行権限を与える
chmod 755 .githooks/pre-push

場合によってはLintチェックを無視してpushしたい場合もあるかと思うので、Lintチェックでエラーがあった場合、pushを続行するか選択できるようにします。

pre-pushのスクリプトの中身は下記のようにします。(※swiftlintのバイナリへのパスは適宜書き換えてください)

.git/hooks/pre-push
#!/bin/bash

set -eu
cd `dirname $0`

echo -n 'Linting... '

lint_result=$(swiftlint --reporter emoji --quiet --path ../ --config ../.swiftlint.yml)

if [ -n "$lint_result" ]; then
  # Lintで警告が見つかった場合、push操作を続けるかユーザに判断させる
  echo 'Some issues found.'
  echo '====================================='
  echo "$lint_result" | sed -e "s/^/>> /"
  echo '====================================='
  echo ''
  echo -n 'Push anyway?[y/N]: '

  exec < /dev/tty
  read YN

  if [ "$YN" = "y" ]; then
    echo 'Ok. continue.'
  else
    echo 'Push aborted.';
    exit 1;
  fi
else
  echo 'No issues found!'
fi

exit 0

最後に、Git Hooksの読み込み先ディレクトリを変更します。
この設定は各自の環境で実行する必要があるので、環境構築手順書に追加するのが良いかと思います

# Git Hooksのディレクトリを.githooksディレクトリに変更
git config --local core.hooksPath .githooks/

動作確認

実際に動作させてみた結果は下記のような感じになります。

規約違反なし

% git push origin HEAD
Linting... No issues found!
Enumerating objects: 33, done.
Counting objects: 100% (33/33), done.
Delta compression using up to 8 threads
Compressing objects: 100% (27/27), done.
Writing objects: 100% (33/33), 8.73 KiB | 2.18 MiB/s, done.
Total 33 (delta 5), reused 0 (delta 0)
remote: Resolving deltas: 100% (5/5), done.
To github.com:zrn-ns/swiftlint_on_pre_push.git
 * [new branch]      HEAD -> main

%

規約違反あり -> push続行

% git push origin HEAD
Linting... Some issues found.
=====================================
>> /path/to/project/AppDelegate.swift
>> ⚠️ Line 36: Files should have a single trailing newline.
>> ⚠️ Line 34: Limit vertical whitespace to a single empty line. Currently 2.
>> /path/to/project/SwiftLintOnPrePush/SceneDelegate.swift
>> ⚠️ Line 52: Files should have a single trailing newline.
>> ⚠️ Line 50: Limit vertical whitespace to a single empty line. Currently 2.
=====================================

Push anyway?[y/N]: y
Ok. continue.
Enumerating objects: 33, done.
Counting objects: 100% (33/33), done.
Delta compression using up to 8 threads
Compressing objects: 100% (27/27), done.
Writing objects: 100% (33/33), 8.73 KiB | 2.18 MiB/s, done.
Total 33 (delta 5), reused 0 (delta 0)
remote: Resolving deltas: 100% (5/5), done.
To github.com:zrn-ns/swiftlint_on_pre_push.git
 * [new branch]      HEAD -> main

%

規約違反あり -> push中止

% git push origin HEAD
Linting... Some issues found.
=====================================
>> /path/to/project/AppDelegate.swift
>> ⚠️ Line 36: Files should have a single trailing newline.
>> ⚠️ Line 34: Limit vertical whitespace to a single empty line. Currently 2.
>> /path/to/project/SwiftLintOnPrePush/SceneDelegate.swift
>> ⚠️ Line 52: Files should have a single trailing newline.
>> ⚠️ Line 50: Limit vertical whitespace to a single empty line. Currently 2.
=====================================

Push anyway?[y/N]: n
Push aborted.
error: failed to push some refs to 'git@github.com:zrn-ns/swiftlint_on_pre_push.git'

%

サンプルプロジェクト

サンプルプロジェクトはこちらにアップしました。

FIXME

今回の手法では、Git Hooksのディレクトリをgit管理下に置くことで、全メンバーがスクリプトを共有する方法をとっています。
この方法は、スクリプトに修正が入った際にも環境間の同期が取れて便利な半面、各メンバーが独自のGit Hooksスクリプトを配置できなくなってしまいます
(masterへの直pushを防止したりするためにもGit Hooksは便利に使えるので、個人でスクリプトを配置したい場面は多いと思います)

何か良いアイディアがあれば教えていただけると幸いです?

まとめ

push前にSwiftLintのチェックを行う方法を解説しました。

この方法を使えば、各ビルドごとにLintチェックのオーバーヘッドがかかることを防げますし、PullRequestの作成前に問題に気づくことができるので、PullRequest作成後にコードを微調整するコストをかなり減らせるはずです。

ただし、新規メンバーが参入した場合には、ビルドごとにLintチェックを掛けてあげたほうが定着は早そうなので、その際はビルドフェーズに追加する方法でLintチェックを行ったほうが良いのかなと思います。

謝辞

下記のサイトを参考にさせていただきました。

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

GitHooksを利用し、リモートリポジトリにPushするときにSwiftLintを実行する

こんにちは。都内でiOSエンジニアをしている @zrn-ns です。

弊社のプロジェクトではSwiftLintを利用しており、最低限のコーディング規約についてはSwiftLintでチェックする事ができるようになっています。

SwiftLintはビルドフェーズに含めることも想定されており、公式のガイドに従うだけでビルド時にLintチェックを行い、規約に沿った記述を徹底させることができます。

しかし今回諸事情があり、ビルドフェーズではなく、Gitでリモートリポジトリにpushする直前でLintチェックを行うようにしてみました。

なぜビルドフェーズではなく、Push時にチェックするのか

ビルドフェーズで実行する方式だとビルド時に多少のオーバーヘッドが発生してしまいます(差分チェックを行ってくれるようなので、ほぼ気にならないレベルですが)。
また弊社社内ではXcode派AppCode派が存在します。AppCodeではSwiftLintのプラグインが存在するため、Lintチェックをビルドフェーズに含める方式だと、2重でLintチェックが行われてしまうことになります。

これらの問題を解消するため、ビルドフェーズでLintチェックを行うのをやめ、リモートリポジトリにコードをpushするタイミングでLintチェックを行うようにしてみました。

どうやってPush時に任意のスクリプトを実行するのか

Gitには、各アクション(commit, push, merge等)の実行の前後に任意のスクリプトを実行するためのGit Hooksという仕組みがあります。

Git Hooksでは、commitやpush, mergeの前後のタイミングで、各Gitリポジトリの.git/hooks/ディレクトリ下に配置したスクリプトが自動的に実行されます。
例えば、pushの直前でスクリプトを実行したい場合、.git/hooks/pre-pushというスクリプトが存在すれば、それが自動的に呼び出されます。

Git Hooksを利用して、push時にSwiftLintを実行する

今回はGit Hooksの設定を全メンバー間で共有できるようにし、全メンバーがpush前にLintチェックを行うことを強制できるようにします。

スクリプトの作成

.git/ ディレクトリ配下はgitで管理されない(コミットできない)ため、.git/hooks/pre-push にスクリプトを記述するとメンバー間で設定を共有することができません。

そこで、git管理下にGit Hooks用のスクリプトを入れておくための専用のディレクトリを作成し、そこに配置したpre-pushスクリプトを参照するようにgitの設定を変更します。

cd {プロジェクトディレクトリ}

# git hooksを入れるためのディレクトリとスクリプトを作成
mkdir .githooks
touch .githooks/pre-push

# スクリプトに実行権限を与える
chmod 755 .githooks/pre-push

場合によってはLintチェックを無視してpushしたい場合もあるかと思うので、Lintチェックでエラーがあった場合、pushを続行するか選択できるようにします。

pre-pushのスクリプトの中身は下記のようにします。(※swiftlintのバイナリへのパスは適宜書き換えてください)

.git/hooks/pre-push
#!/bin/bash

set -eu
cd `dirname $0`

echo -n 'Linting... '

lint_result=$(swiftlint --reporter emoji --quiet --path ../ --config ../.swiftlint.yml)

if [ -n "$lint_result" ]; then
  # Lintで警告が見つかった場合、push操作を続けるかユーザに判断させる
  echo 'Some issues found.'
  echo '====================================='
  echo "$lint_result" | sed -e "s/^/>> /"
  echo '====================================='
  echo ''
  echo -n 'Push anyway?[y/N]: '

  exec < /dev/tty
  read YN

  if [ "$YN" = "y" ]; then
    echo 'Ok. continue.'
  else
    echo 'Push aborted.';
    exit 1;
  fi
else
  echo 'No issues found!'
fi

exit 0

最後に、Git Hooksの読み込み先ディレクトリを変更します。
この設定は各自の環境で実行する必要があるので、環境構築手順書に追加するのが良いかと思います

# Git Hooksのディレクトリを.githooksディレクトリに変更
git config --local core.hooksPath .githooks/

動作確認

実際に動作させてみた結果は下記のような感じになります。

規約違反なし

% git push origin HEAD
Linting... No issues found!
Enumerating objects: 33, done.
Counting objects: 100% (33/33), done.
Delta compression using up to 8 threads
Compressing objects: 100% (27/27), done.
Writing objects: 100% (33/33), 8.73 KiB | 2.18 MiB/s, done.
Total 33 (delta 5), reused 0 (delta 0)
remote: Resolving deltas: 100% (5/5), done.
To github.com:zrn-ns/swiftlint_on_pre_push.git
 * [new branch]      HEAD -> main

%

規約違反あり -> push続行

% git push origin HEAD
Linting... Some issues found.
=====================================
>> /path/to/project/AppDelegate.swift
>> ⚠️ Line 36: Files should have a single trailing newline.
>> ⚠️ Line 34: Limit vertical whitespace to a single empty line. Currently 2.
>> /path/to/project/SwiftLintOnPrePush/SceneDelegate.swift
>> ⚠️ Line 52: Files should have a single trailing newline.
>> ⚠️ Line 50: Limit vertical whitespace to a single empty line. Currently 2.
=====================================

Push anyway?[y/N]: y
Ok. continue.
Enumerating objects: 33, done.
Counting objects: 100% (33/33), done.
Delta compression using up to 8 threads
Compressing objects: 100% (27/27), done.
Writing objects: 100% (33/33), 8.73 KiB | 2.18 MiB/s, done.
Total 33 (delta 5), reused 0 (delta 0)
remote: Resolving deltas: 100% (5/5), done.
To github.com:zrn-ns/swiftlint_on_pre_push.git
 * [new branch]      HEAD -> main

%

規約違反あり -> push中止

% git push origin HEAD
Linting... Some issues found.
=====================================
>> /path/to/project/AppDelegate.swift
>> ⚠️ Line 36: Files should have a single trailing newline.
>> ⚠️ Line 34: Limit vertical whitespace to a single empty line. Currently 2.
>> /path/to/project/SwiftLintOnPrePush/SceneDelegate.swift
>> ⚠️ Line 52: Files should have a single trailing newline.
>> ⚠️ Line 50: Limit vertical whitespace to a single empty line. Currently 2.
=====================================

Push anyway?[y/N]: n
Push aborted.
error: failed to push some refs to 'git@github.com:zrn-ns/swiftlint_on_pre_push.git'

%

サンプルプロジェクト

サンプルプロジェクトはこちらにアップしました。

FIXME

今回の手法では、Git Hooksのディレクトリをgit管理下に置くことで、全メンバーがスクリプトを共有する方法をとっています。
この方法は、スクリプトに修正が入った際にも環境間の同期が取れて便利な半面、各メンバーが独自のGit Hooksスクリプトを配置できなくなってしまいます
(masterへの直pushを防止したりするためにもGit Hooksは便利に使えるので、個人でスクリプトを配置したい場面は多いと思います)

何か良いアイディアがあれば教えていただけると幸いです?

まとめ

push前にSwiftLintのチェックを行う方法を解説しました。

この方法を使えば、各ビルドごとにLintチェックのオーバーヘッドがかかることを防げますし、PullRequestの作成前に問題に気づくことができるので、PullRequest作成後にコードを微調整するコストをかなり減らせるはずです。

ただし、新規メンバーが参入した場合には、ビルドごとにLintチェックを掛けてあげたほうが定着は早そうなので、その際はビルドフェーズに追加する方法でLintチェックを行ったほうが良いのかなと思います。

謝辞

下記のサイトを参考にさせていただきました。

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

git add *コマンドでは.gitignoreで指定したファイルを無視できないため、不整合でステージングエリアへ追加できない

Laravel5.5でECサイトを作成している時にgit add できなくて苦戦したことを記録で残します。
git version 1.8.3.1です。

1、起きたこと

gitのmyprojectディレクトリでgit add * のコマンドを打ったときに以下のエラーが出ました。

【エラー文】
The following paths are ignored by one of your .gitignore files:
vendor
Use -f if you really want to add them.
fatal: no files added

これは要するに、.gitignoreファイルでvendorを無視しているからステージングエリアに追加できませんよ
と書いてあります。また、-fオプションを使うと追加できますよとアドバイスもありました。
そして、ステージングエリアには何もファイルが追加されていません。

.gitignoreファイルについてよく知らない人はこちらへ

-fオプションを使うとvendorもステージングエリアに追加されてしまうため今回は使用しません。

2、解決方法

git add . コマンドを実行して解決しました。

どうやら、git add *は全てのファイルを関係なくステージングエリアに追加しようとして.gitignoreでの指定したファイルとの不整合で追加できてなかったと思わます。
git add .コマンドでは問題なく.gitignoreで指定したファイルを無視してステージングエリアに追加する事ができた。

今後はgit add . コマンドを使用していこうと思っています。

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

特定のcommitをclone

...はできなさそうなので下記で。

git init
git remote add origin <hostname>:<owner>/<repo>.git
git fetch --depth 1 origin <commit_id>
git reset --hard FETCH_HEAD

備忘録

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

共同開発講座を受講中にコツコツ書いた「詰まったメモ」をジャンル別に全て公開します【GitHub編】

はじめに

タイトルの通り、共同開発講座を受講中に起きたトラブルや詰まりポイントをまとめたメモ(約50記事)をジャンル別に全て公開します。
ジャンルは以下の通りなので、気になるものがあればぜひご覧ください。

【ジャンル一覧】

・GitHub関連
・Laravel関連
・php関連
・データベース(migration/seeding)関連
・環境関連
・総まとめ集

下記の点を、ご了承ください。
ジャンルで統一しているため、内容に関しては統一性はありません。
なるべく有用性の高いメモの使用を心がけておりますが、あくまで初学者向けの内容となっております。
自分用のメモを転用しておりますので、表現が稚拙な部分があるかと思います。

・branchの切り方

ターミナルにて編集したファイルがあるディレクトリまで移動する

cd ディレクトリ名

git branch で今自分がいるブランチを確認する

[vagrant@local-docker lara-d]$ git branch
* develop

この *develop はある機能を開発するために切ったブランチ(自分の大元となるブランチ)で、ここからさらにブランチを切らないといけない

新しいブランチを切る

git branch 新しいブランチ名 

git checkout ブランチ名 でブランチを移動する(*が動く)

[vagrant@local-docker lara-d]$ git branch
  develop
* 新しいブランチ名

↑このようになれば、このブランチで開発を進めて大丈夫!

・git add -u コマンド

詰まった状況

開発ブランチで不要になったファイル(Modelファイル)をローカルテキストエディタで削除

git add .

git commit -m "○○"

リモートへpush

上記を行うが削除したModelファイルが残ったままで、削除が反映されていない。
ただ、ローカルテキストエディタ上では消えている。。

原因

ファイル削除に関しては
git add .    コマンドの「 . 」は”全てのファイルをステージング”の意味になるので
削除されたものはリモート上では消えないことになる(存在し続ける)

解決策

ステージングする時にオプションコマンドを用いる
git add -u コマンドを使用する
-u とは update の略で、削除も反映してくれるらしい。
具体的に言うと
Git 管理対象のファイルの変更、削除をすべてステージする。(新規ファイルは無視。)

・git clone と git pull の違い

【git clone】

リモートリポジトリにあるディレクトリ構造を「そのまま全て」ローカルリポジトリの新たなブランチに丸々コピーする。

→開発の初回に行う??

【git pull】

Git cloneを行った後、誰かが開発して、元のリモートリポジトリにpushしたとする。
その更新分のみを自分のローカルリポジトリに反映させたい場合、git pullを用いてコピーすると
更新した差分のみが自分のところにpullされる(引っ張ってくる)。

→開発過程に入ると更新されるたびに必要であれば毎回行う作業

・リモートからのpull方法

pullは基本的にリモートのメインブランチに行う。

//ブランチを表示して自分がローカルのメインブランチにいることを確認
[vagrant@local-docker lara-d]$ git branch
* develop_alpha
  feature/kei/createProductsTable
  feature/kei/createUserRegist

pull実行時は以下のようになる↓↓

//pullコマンドを実行
[vagrant@local-docker lara-d]$ git pull origin develop_alpha


From https://github.com/*******/*******
 * branch            develop_alpha -> FETCH_HEAD
Auto-merging routes/web.php
Removing resources/views/welcome.blade.php
Merge made by the 'recursive' strategy.
 app/Providers/AppServiceProvider.php                        |   3 +-
 config/app.php                                              |   2 +-
 database/.DS_Store                                          | Bin 0 -> 6148 bytes
 .../migrations/2020_11_21_234119_create_m_categories.php    |  31 ++++++++
 .../2020_11_21_234253_create_m_sales_statuses.php           |  31 ++++++++
 .../2020_11_21_234400_create_m_products_statuses.php        |  31 ++++++++
 database/migrations/2020_11_22_120214_create_m_products.php |  42 +++++++++++
 .../migrations/2020_11_23_031335_create_purchases_table.php |  39 ++++++++++
 database/seeds/DatabaseSeeder.php                           |   5 ++
 database/seeds/M_CategoriesSeeder.php                       |  23 ++++++
 database/seeds/M_ProductsSeeder.php                         |  75 +++++++++++++++++++
 database/seeds/M_Products_StatusesSeeder.php                |  31 ++++++++
 database/seeds/M_Sales_StatusesSeeder.php                   |  27 +++++++
 database/seeds/PurchasesTableSeeder.php                     |  65 ++++++++++++++++
 public/css/base.css                                         |  79 ++++++++++++++++++++
 resources/views/commons/error_messages.blade.php            |   7 ++
 resources/views/commons/footer.blade.php                    |   4 +
 resources/views/commons/header.blade.php                    |  15 ++++
 resources/views/layouts/app.blade.php                       |  34 +++++++++
 resources/views/login/login.blade.php                       |  13 ++++
 resources/views/welcome.blade.php                           |  99 -------------------------
 routes/web.php                                              |   4 +-
 22 files changed, 557 insertions(+), 103 deletions(-)
 create mode 100644 database/.DS_Store
 create mode 100644 database/migrations/2020_11_21_234119_create_m_categories.php
 create mode 100644 database/migrations/2020_11_21_234253_create_m_sales_statuses.php
 create mode 100644 database/migrations/2020_11_21_234400_create_m_products_statuses.php
 create mode 100644 database/migrations/2020_11_22_120214_create_m_products.php
 create mode 100644 database/migrations/2020_11_23_031335_create_purchases_table.php
 create mode 100644 database/seeds/M_CategoriesSeeder.php
 create mode 100644 database/seeds/M_ProductsSeeder.php
 create mode 100644 database/seeds/M_Products_StatusesSeeder.php
 create mode 100644 database/seeds/M_Sales_StatusesSeeder.php
 create mode 100644 database/seeds/PurchasesTableSeeder.php
 create mode 100644 public/css/base.css
 create mode 100644 resources/views/commons/error_messages.blade.php
 create mode 100644 resources/views/commons/footer.blade.php
 create mode 100644 resources/views/commons/header.blade.php
 create mode 100644 resources/views/layouts/app.blade.php
 create mode 100644 resources/views/login/login.blade.php
 delete mode 100644 resources/views/welcome.blade.php
[vagrant@local-docker lara-d]$ 

・リモートリポジトリへのpush時にアクセスが拒否される

※こちらは、制限付き?のgithubリポジトリでの、認可?されるためのurl設定の方法です

ターミナルにて

//commitする

[vagrant@local-docker lara-d]$ git commit -m"add:DB構築-products関連"
[feature/keisuke/Db_Products 8832492] add:DB構築-products関連
 12 files changed, 285 insertions(+), 2 deletions(-)
 create mode 100644 database/.DS_Store
 create mode 100644 database/migrations/2020_11_21_234119_create_m_categories.php
 create mode 100644 database/migrations/2020_11_21_234253_create_m_sales_statuses.php
 create mode 100644 database/migrations/2020_11_21_234400_create_m_products_statuses.php
 create mode 100644 database/migrations/2020_11_22_120214_create_m_products.php
 create mode 100644 database/seeds/M_CategoriesSeeder.php
 create mode 100644 database/seeds/M_ProductsSeeder.php
 create mode 100644 database/seeds/M_Products_StatusesSeeder.php
 create mode 100644 database/seeds/M_Sales_StatusesSeeder.php

//状態を確認

[vagrant@local-docker lara-d]$ git status
# On branch feature/kei/Db_Products
nothing to commit, working directory clean

Git push origin HEAD で今のメインブランチにプッシュするがエラーが起きる

//pushする

[vagrant@local-docker lara-d]$ git push origin HEAD
Username for 'https://github.com': ○○○○○○
Password for 'https://********@github.com': 
remote: Permission to ****/****.git denied to *******.
fatal: unable to access 'https://github.com/****/****.git/': The requested URL returned error: 403

//リモートの登録URLを確認してみる
[vagrant@local-docker lara-d]$ git remote -v
origin  https://github.com/****/****.git (fetch)
origin  https://github.com/****/****.git (push)
[vagrant@local-docker lara-d]$ 

Remoteに登録してあるurlの変更

[vagrant@local-docker lara-d]$ git remote set-url origin https://○○○○○○@github.com/quest-academia/yanbaru_ec_traning.git/

原因

元々セットしていたURL
https://github.com/・・・・/・・・・.git

httpsの後ろに何もないのが原因。
ここには自分のgithubアカウント名が入る。
正しくは
https://○○○○○○@github.com/・・・・/・・・・.git/
となる。
この後再プッシュして成功

・リモート名の変更

git remote set-url コマンドを使ってurlをセットし直す

[vagrant@local-docker lara-d]$ git remote set-url origin https://○○○○○○@github.com/****/****.git

セットされたかの確認

[vagrant@local-docker lara-d]$ git remote -v
origin  https://○○○○○○@github.com/****/****.git (fetch)
origin  https://○○○○○○@github.com/****/****.git (push)
[vagrant@local-docker lara-d]$ 

//セット完了!

・共同開発中、最新のリモートdevelopをプルして開発ブランチにマージする方法

前提として、pullするのはローカルのメインブランチなので、現在開発中(作業中)のブランチからメインブランチに移動してからpullする必要がある。
移動時にコミットしていない部分があると、開発中の内容がメインブランチに移動してしまう。
なので、まずは開発中のブランチにて、commit もしくは stashをして、移動できる状態を作ること。
個人的にはcommitの方が安心。

ここからは開発ブランチにて、commit もしくは stash が行われたことを前提に書きます。

develop_alphaブランチ(ローカルのメインブランチ)に移動

[vagrant@local-docker lara-d]$ git checkout develop_alpha
Switched to branch 'develop_alpha'

移動を確認

[vagrant@local-docker lara-d]$ git branch
  createUserRegist_2
* develop_alpha

リモートのdevelop_alphaブランチ(リモートのメインブランチ)をpullしてくる

[vagrant@local-docker lara-d]$ git pull origin develop_alpha
remote: Enumerating objects: 43, done.
remote: Counting objects: 100% (43/43), done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 55 (delta 33), reused 39 (delta 33), pack-reused 12
Unpacking objects: 100% (55/55), done.
From https://github.com/****/****
 * branch            develop_alpha -> FETCH_HEAD
Updating 53acc0b..fbabfb3
Fast-forward
 app/Http/Controllers/HomeController.php                             |  16 ++
 app/User.php                                                        |   1 +
 composer.lock                                                       | 316 +++++++++++++++++++++++++++++++
 .../2020_11_20_032020_create_m_shipments_statuses_table.php         |  31 +++
 database/migrations/2020_11_22_120214_create_m_products.php         |   3 +-
 database/migrations/2020_11_23_031335_create_purchases_table.php    |   8 +-
 database/migrations/2020_12_21_064840_create_t_orders_table.php     |  36 ++++
 .../migrations/2020_12_21_151942_create_t_orders_details_table.php  |  44 +++++
 database/seeds/DatabaseSeeder.php                                   |  11 +-
 database/seeds/M_ShipmentsStatusesTableSeeder.php                   |  22 +++
 database/seeds/M_UsersTableSeeder.php                               |  30 ---
 database/seeds/PurchasesTableSeeder.php                             |  20 +-
 database/seeds/T_OrdersDetailsTableSeeder.php                       |  40 ++++
 database/seeds/T_OrdersTableSeeder.php                              |  22 +++
 resources/views/auth/login.blade.php                                |  38 ++++
 resources/views/commons/header.blade.php                            |  29 ++-
 resources/views/home.blade.php                                      |  14 ++
 resources/views/login/login.blade.php                               |  13 --
 routes/web.php                                                      |  28 ++-
 19 files changed, 647 insertions(+), 75 deletions(-)
 create mode 100644 app/Http/Controllers/HomeController.php
 create mode 100644 database/migrations/2020_11_20_032020_create_m_shipments_statuses_table.php
 create mode 100644 database/migrations/2020_12_21_064840_create_t_orders_table.php
 create mode 100644 database/migrations/2020_12_21_151942_create_t_orders_details_table.php
 create mode 100644 database/seeds/M_ShipmentsStatusesTableSeeder.php
 create mode 100644 database/seeds/T_OrdersDetailsTableSeeder.php
 create mode 100644 database/seeds/T_OrdersTableSeeder.php
 create mode 100644 resources/views/auth/login.blade.php
 create mode 100644 resources/views/home.blade.php
 delete mode 100644 resources/views/login/login.blade.php

//pullが完了

開発ブランチに移動する

[vagrant@local-docker lara-d]$ git checkout createUserRegist_2
Switched to branch 'createUserRegist_2'

pullしてきたdevelop_alphaブランチを、開発ブランチにマージする

[vagrant@local-docker lara-d]$ git merge develop_alpha
Auto-merging routes/web.php
Removing resources/views/login/login.blade.php
Auto-merging database/seeds/DatabaseSeeder.php
CONFLICT (content): Merge conflict in database/seeds/DatabaseSeeder.php
Auto-merging app/User.php
Automatic merge failed; fix conflicts and then commit the result.

コンフリクトが起きた・・・

エディタ上でコンフリクト解消

もう一度develop_alphaをマージしようとするが...

[vagrant@local-docker lara-d]$ git merge develop_alpha
error: 'merge' is not possible because you have unmerged files.
hint: Fix them up in the work tree,
hint: and then use 'git add/rm <file>' as
hint: appropriate to mark resolution and make a commit,
hint: or use 'git commit -a'.
fatal: Exiting because of an unresolved conflict.

エラー。
どうやらマージされていないファイルがある??...いや、だからマージしたいんだが...?
ただ、コンフリクトが起きているファイルをどうにかしないといけない。

そこで

git statusで状態を確認

[vagrant@local-docker lara-d]$ git status
# On branch createUserRegist_2
# You have unmerged paths.
#   (fix conflicts and run "git commit")
#
# Changes to be committed:
#
#   new file:   app/Http/Controllers/HomeController.php
#   modified:   app/User.php
#   modified:   composer.lock
#   new file:   database/migrations/2020_11_20_032020_create_m_shipments_statuses_table.php
#   modified:   database/migrations/2020_11_22_120214_create_m_products.php
#   modified:   database/migrations/2020_11_23_031335_create_purchases_table.php
#   new file:   database/migrations/2020_12_21_064840_create_t_orders_table.php
#   new file:   database/migrations/2020_12_21_151942_create_t_orders_details_table.php
#   new file:   database/seeds/M_ShipmentsStatusesTableSeeder.php
#   modified:   database/seeds/M_UsersTableSeeder.php
#   modified:   database/seeds/PurchasesTableSeeder.php
#   new file:   database/seeds/T_OrdersDetailsTableSeeder.php
#   new file:   database/seeds/T_OrdersTableSeeder.php
#   new file:   resources/views/auth/login.blade.php
#   modified:   resources/views/commons/header.blade.php
#   new file:   resources/views/home.blade.php
#   deleted:    resources/views/login/login.blade.php
#   modified:   routes/web.php
#
# Unmerged paths:
#   (use "git add <file>..." to mark resolution)
#
#   both modified:      database/seeds/DatabaseSeeder.php

commitされていない状態なので一度commitしてみる

[vagrant@local-docker lara-d]$ git add .

vagrant@local-docker lara-d]$ git commit -m "develop_alphaをプル、コンフリクト解消"
[createUserRegist_2 eb2549c] develop_alphaをプル、コンフリクト解消

この後、開発ブランチへのマージに成功

結果、commitしたらオッケーだった
コンフリクトが起きているファイルは自分のファイルを使うのか、リモートにあったファイルを使うのかを決めレバそれで解消されるので(?)
解消した後にcommitするとマージコミット?が生成される。

この項のまとめ

①developに移動
git checkout develop
②developを最新に更新
git pull origin develop
③自分の開発に移動
git checkout 自開発branch
④現在の開発ブランチとdevelopブランチをマージ。
git merge develop
⑤コンフリクト処理(コンフリクトがあれば)

エディタ上で簡単に処理できます。(リモートの内容を使うのか、自分の内容を使うのか、両方の内容を使うのかを選択するだけ!)

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

gitのアカウントを変えたらpushできなくなった話

はじめに

gitのエラー対処を忘れたないための自分用メモです。
また、環境はWindowsにgitをインストールした環境になります。

エラー発生から解消まで

諸事情でgithubのアカウントをuserYYYからuserXXXに変更しました。
するとpush時に以下のエラーが発生。

>git push
remote: Permission to userXXX/repo.git denied to userYYY.
fatal: unable to access 'https://github.com/userXXX/repo.git/': The requested URL returned error: 403 

どこかしらに以前のアカウントuserYYYの情報が残っているらしい。
ただ、gitのアカウント情報を確認するも問題なく変更できてそう・・・

>git config --global --list
user.name=userXXX
user.email=userXXX@gmail.com

試しにgitを再インストールしてみましたが、エラーは改善されずpushできませんでした。
本当に悲しい。。。

そこでOS側の設定を確認してみました。
するとWindowsの資格情報の管理にgitのアカウントを管理してそうなものがありました。

000.png

画像の更新日時は"今日"になってますが、最初はかなり古い日時になってました。
gitの情報を削除し、再度pushすると無事に成功しました。

>git push
info: please complete authentication in your browser...
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 264 bytes | 132.00 KiB/s, done.
Total 2 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/userXXX/repo.git
   166bd4e..2b8dd3b  main -> main

雑感

  • gitのアカウント情報はgit側とOS側の二人がもっているらしい。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Error: Cannot find a valid baseurl for repo: baseのエラー解決法

エラー

[root@localhost ~]#
にて、
gem install git
をしたらタイトルのエラーが出たので、解決方法を探しました。

解決方法

vagrantを使っていたので、まず自身のCentOSのバージョンを確認します。

# cat /etc/redhat-release

そして、次に

# cd /etc/yum.repos.d
# vi CentOS-Base.repo

とコマンドを実行し、CentOS-Base.repo ファイルを修正します。

mirrorlist= の行をコメントアウトし、新たに baseurl= の行を追加します。

[base]
name=CentOS-$releasever - Base
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra ←★コメントアウトする
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
baseurl=http://vault.centos.org/6.4/os/$basearch/ ←★この行を追加する
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

追加した行 baseurl=http://vault.centos.org/6.4/os/$basearch/ の太字部分はCentOSのバージョンにあわせて書き換えてください。 CentOS-Base.repo ファイルにはbaseブロック以外にも updates、extras、centosplus、contrib のブロックがあるので同様に書き換えます。

再度実行

yum install git

を再度実行したら、無事にインストールすることができました。

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