20191028のGitに関する記事は6件です。

[初心者向け]herokuにpushするときに失敗したら

はじめに

最近ようやくGitやHerokuを使い始めて、色々と詰まった点について自分用のまとめとして、後私と同じような初心者の方があれ?ってなった時の対処方法として見てもらえればと思って投稿します。

git push heroku masterでエラーが出る

もう、何だよって思いますよね。
例えば"Could not read from remote repository"とか出てきます。

ここでは色々な対処法をとりあえず乗っけておきます。

リポジトリの追加

先ほどの"Could not read from remote repository"ですが、
その前に"'heroku' does not appear to be a git repository"
とか書かれていることがあるかと思います。

そういうときはリポジトリを追加してあげましょう。

$ git remote add heroku 追加したいリポジトリURL
# herokuで言えばHeroku Git URLが追加したいリポジトリURLになります。

Herokuのアプリケーション画面のSettingsから確認できます。

heroku_git_url.png

ちなみにリポジトリ一覧のコマンドは以下。
追加できているかを確認してみて下さい。

$ git remote

公開鍵の作成

ローカルで開発してて、サーバーは初心者って方は公開鍵とか聞くとちょっと嫌になるレベルですよね。
私は完全独学プログラマーなのでこの辺りとか最初マジで意味わからなかったです。← そのくらい理解しろよ

以下のようなエラーメッセージ
"Please make sure you have the correct access rights 
and the repository exists."
が出てきた場合は以下のコマンドで公開鍵を作成してあげて下さい。

$ heroku keys:add

これで大体は解決すると思います。

その他検索候補

あとはとりあえず検索した上で、状況に応じて使用してほしいコマンドです。

$ heroku auth:token

認証に失敗したときにトークンを発行します。
これで発行された文字列をコピーし、pushを行います。

Usernameは入れずにエンター
Passwordに先ほどのトークンをペースト

これでいける場合もあります。

最後に

とりあえず私が詰まって解決策ググりまくった過程をだらだら記述した感じになりますが、これで問題を解決できる人が一人でもいればうれしいです。
また違う問題見つかったらちょっとずつ追記していこうと思います。

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

ブランチ名をコピーするエイリアスでちょっと幸せになれる。

記事にする程でもないですが、ちょっと幸せになれるエイリアスをご紹介します。

Gitブランチ名をコピーするエイリアス

↓ 下記のありがたい記事を参考に、エイリアスを少しだけカスタマイズします。(ありがとうございます)
- Gitのブランチ名を返すエイリアスを設定したら地味に捗った

▽ エイリアスを.zshrcもしくは.bashrcに追加します。

.zshrc
 alias brcopy='git symbolic-ref --short HEAD | pbcopy'

パイプを利用してmacのpbcopyコマンドに出力されたブランチ名を渡しています。

このようにブランチ名を簡単にコピーできるようになりました。
e69c235807e1e2407c2e36f4c569f9b7.gif

シェルの補完で十分ですが、設定しておくとたまに使える便利なエイリアスでした。

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

【エラー対処】error failed to push some refs to pre-receive hook declinedが出るとき意外と忘れがちなこと

はじめに

普段どおりGitKerakenでコミットして、意味もないけどプッシュしとくか〜〜
って思ったら、プッシュがいかない。

error failed to push some refs to pre-receive hook declined

みたいなメッセージが出る。

普段ならうまくいくのに、急にいかない!?ってなりました。

色々探した後...

色々とネットを探しても、関係ありそうな情報がない。
そこで、ファイルを入れたり出したりを繰り返すとどうやら重いファイルを含んでいると上記エラーが出ているっぽい。

GitHubの制約を見ると

  • 50MB以上のファイルで警告が出る
  • 100MB以上のファイルはアップロードできない

とありました。

どうやらGitKerakenではこのように100MB以上のファイルを含んでいるとエラーを

error failed to push some refs to pre-receive hook declined

のように出すっぽいです。

事実、100MB以上のファイルを除けば普通にプッシュできました。

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

【遭難防止】Git初心者のための現状確認コマンドの意味まとめ git status, git log,git diff【俺、今どこにいるの?】

これを理解するまで、例えるなら山で地図とコンパスとGPSを持っているけど使い方がわからなくて(使っていなくて)道迷いしまくるような状態でした。

「もうGitで遭難したくない!」というあなたに役立てばと思います。

誤り等あればご指摘頂けますと幸いです。

この記事が役立つ人

  • 細かい表示内容は置いといて、意味を知りたい
  • 確認系の各種コマンドはよく分からない
  • Git初心者
  • add commit pushの意味は分かる

各コマンドの表示単位

表示単位が小さい順から大きい順です。

【小】git diff

「ファイルの中身」を表示。

差分を抽出してくれる。
qで抜けられる。

【中】git status

「ファイル」を表示。

現在、最新のcommit後にどこが変更になったのかをファイル単位で教えてくれる。

【大】git log

commitを表示。

現在いるbranchの中での「commitの履歴」を教えてくれる。

表示したいこと別 コマンド一覧

オプションも多すぎて、どれを使ったらいいか分からないですよね。
これを使えば現状把握にはそう困らないと思います。

まずはオプションなしで使ってみることで、根本の機能を理解するのが大事ですね。

注意点
あれ?戻らない!と思ったら、だいたいqを押せば抜けられます。

【ファイルの中身単位】git diff

1.(オプションなし) addされる前の内容を表示したい。

$ git diff

2.addされてるけどcommitされていない内容を表示したい。

$ git diff --cached

【ファイル単位】git status

1.(オプションなし)前回のcommitから変更のあったファイルを表示したい。

$ git status

2.コンパクトにgit statusを表示したい。

$ git status -s

【commit単位】git log

1.(オプションなし)commitした履歴を一覧表示したい。

git log

2.コンパクトにgit logを表示したい。

git log --oneLine

3.どこを変更したかをgit logを表示したい。
追加表示されるのは「ファイルの中身」
git diffをついでに表示するイメージ。

git log -p

4.どこを変更したかをgit logを表示したい。
追加表示されるのは「行数」
追加・削除件数が視覚的に分かるので「ここに大きな変更があったんだ」とわかりやすい。

git log --stat

参考にさせて頂いたサイト(いつもありがとうございます)

git入門 (全22回) - プログラミングならドットインストール
git logコマンドまとめ - Qiita

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

Git の使い方まとめ的 (最低限) なやつ

友達とかに軽く説明するときに使うかもなーっと思ってメモしておく記事です。
https://git-scm.com/docs
↑ これ読んだほうが早いので読める人はこっちどうぞ

※ 適宜使いそうなコマンドを追加しておきます、知りたい動作あったら気軽にどうぞ

git を使用する前の準備

※ Windows、Mac ともに Git が使用できる状態になっていることが前提
1. git config --global user.name "Your User Name"
2. git config --global user.email Your Account Email Address

この 2つのコマンドを実行する

(例)
git config --global user.name "John Doe"
git config --global user.email johndoe@example.com

GitHub に Push するまでの流れ (コマンドライン)

  1. ターミナルを開いてコミットしたいプロジェクトのディレクトリに移動する
    Git_Commit_01

  2. git status で差分や今のブランチを確認する (ここはやらなくてもいい)
    Git_Commit_02

  3. git add でコミットするファイルを指定する
    Git_Commit_03

    • 基本的には git add . の全ファイルコミットの指定でOK
    • 個別でファイルをコミットしたいときは git add 個別にコミットしたいファイル名 で指定する
  4. git commit でコミットメッセージを指定する
    Git_Commit_04

    • 基本的には git commit -m "コミットメッセージ" でOK
    • 個人的には git commit で vi モードを立ち上げてコミットメッセージを指定する方法が間違えなくて楽かと
  5. git push でプロジェクトにプッシュする
    Git_Commit_05

    • master ブランチに push する場合は git push のみでOK
    • ブランチをわけて作業している場合は、 git push origin ブランチ名 でプッシュする

作業ブランチを変更する場合

  1. git pull で現状のリポジトリ情報を更新する
    • ファイルの更新を行いたくない場合は git fetch
  2. git status で現状のブランチを確認する
    • On branch <BranchName>
  3. git checkout でブランチを変更する
    • すでに存在しているブランチに変更する場合は git checkout <BranchName>
    • 新しくブランチを作成する場合は git checkout -b <BranchName>
  4. git statusOn branch 変更したブランチ名 と表記されていればOK
    • git branch でも確認できます

他の人が git push したリポジトリデータを自分のリポジトリに反映させる場合

  1. git pull で反映される
    • master ブランチ以外のデータを反映させたい場合は git pull origin <BranchName>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

git hooksを使って、確認しながらコミットする話。

はじめに

 gitを使って開発しているときに、commitやpushをしてしまったあとに、「また、var_dumpを残してしまった」, 「DEBUGコメントが残ってしまってる...」,「なんだこの差分は!」 となることが結構あった。そこで、git commitする前に、var_dumpやDEBUGコメントが残っていないかを確認する仕組みがあれば良いと考え、git hooksを用いて実装することにした。また、pushする前にも、余分な差分が入っていないか親ブランチとのdiffをチェックができ、もし問題があったらpushを中断することも試みた。

GitHooks

詳しくはgitのドキュメントを見ていただきたいが、簡単に説明すると、gitでpushしたり、commitした時などに、あるスクリプトを実行することができる仕組みのことである。
.git/hooksの中に決められた名前のスクリプトを用意しておくと、実行することができる。
たとえば、.git/hooks/pre-commitというファイルを用意しておくと、commitメッセージが入力される前にpre-commitに書かれているスクリプトを実行することができる。
pre-commitフックに関するドキュメントの説明では、

これは、いまからコミットされるスナップショットを検査したり、何かし忘れた事がないか確認したり、テストが実行できるか確認したり、何かしらコードを検査する目的で使用されます。

とあり、commit前の確認に利用することができる。その他にも、gitコマンドを利用する側(クライアント)だけでなく、gitでpushされる先(サーバーサイド)で役に立つHooksもあるようだが、ここでは割愛する。

今回は、
1. gitでcommitする前に、var_dumpや//DEBUGの文字列がcommitするファイルに含まれていないかを確認する
2. 1で、もし含まれていたら、ユーザーへ確認の上、該当の行を削除する
3. commit メッセージを入力する画面に入る前に、処理を続行するか確認する
4. pushを実行する前に、現在のbranch名と親のbranch名を表示して確認する
5. 4の後に、親branchとの差分をdiffで表示してから、pushを続行するか確認する

の処理をそれぞれ、commitもしくはpushの際に行う。

pre-commitで、commit前の確認と余計なDEBUG文の削除を行う

まず、commit前に確認を行うため、hooks/pre-commitに処理を記述していく。ここで、commit対象のファイルに問題がないかをチェックするためには、git addした(ステージングされた)ファイルを特定する必要がある。ここでは、以下のように、素直にgit statusの結果を"modified"と"new file"でgrepして取得している。

# addされたファイル一覧を取得
files=`git status|grep -e "modified" -e "new file"|sed "s/new file:\(.*\)/\1/g"|sed "s/modified:\(.*\)/\1/g"|cut -f 2`

次に各ファイル(ここでは*.phpに限定している)に対して、grepして、var_dumpや//DEBUGが含まれていないかを確認した。
もし含まれていたら、ユーザーに、[warn] delete, continue? [y/N]と削除してもいいか尋ねるようにしている。ここで、標準入力からyが入力されたら、sedのコマンドで、その行を削除する仕組みである。このとき、削除前のファイルがcommitされてしまうので、再度addしておく必要がある。もしy以外のものが入力されたら、[error] delete abort.と表示して処理を中断する。その後、同じような仕組みで、[warn] commit, continue? [y/N]と表示され、commitを中断したいときは中断することができるようになっている。以下に実装を載せておく。

hooks/pre-commit
# addされたファイル一覧を取得
files=`git status|grep -e "modified" -e "new file"|sed "s/new file:\(.*\)/\1/g"|sed "s/modified:\(.*\)/\1/g"|cut -f 2`
# それぞれのファイルをscanして、var_dump, //DEBUGを含む行を削除して、addし直してからcommitする
for file in $files
do
    echo name:$file;

    # PHPファイルのみ対象とする
    if [ ${file##*.}="php" ]; then
       echo check... var_dump, //DEBUG in $file;
       result=`less $file | grep -e "var_dump" -e "//DEBUG"`;

       if [ -z $result ]; then
           echo "OK\n";
       else
           echo $result;
           echo '[warn] delete, continue? [y/N]'

           exec < /dev/tty
           read answer

           case $answer in
               'y' | 'yes') sed -i "/var_dump/d" $file; sed -i "/\/\/DEBUG/d;" $file;;
                * ) echo '[error] delete abort.';exit 1;
            esac
            git add $file;
            echo $file;
        fi
    fi
done

echo '[warn] commit, continue? [y/N]';
exec < /dev/tty
read answer

case $answer in
    'y' | 'yes') echo 'OK.';exit 0;;
    * ) echo '[error] commit abort.'; exit 1;;
esac 

pre-pushで、現在のbranch名と親ブランチとの差分を表示してからpushできるようにする

ここでは、リモートリポジトリへのpush前に、現在のbranch名と、その親ブランチ名を取得して、git diffを表示した。そのあとは、前述したcheck機構でpushの中断を可能にした。下に示したようにgit branchの*がついているbranch名を取得することで現在のbranchを取得している。他にも方法はありそうだが......
一方で、親ブランチ名の取得は、git show-branch --current で現在のbranchを含んで表示させ、一番上のbranch名を取得している。この親branch名の取得は、ここを参考にしている。
以下にコード全体を示しておく。

hooks/pre-push
# 親branchと現在のbranchとの差分を表示
current_branch=`git branch|grep "*"|sed "s/* //g"`;
parent_branch=`git show-branch --current |head -n 1| sed "s/\[ \(.*\) \]/\1/g"|cut -d" " -f 2| sed "s/\[\(.*\)\]/\1/g"`;
git diff $parent_branch $current_branch;

# 現在のbranchのcommit logをonelineで表示
git log $current_branch --oneline;

# push確認
echo 'parent branch is '$parent_branch;
echo 'current branch is '$current_branch;
echo '[warn] push to remote, continue? [y/N]'

exec < /dev/tty
read answer

case $answer in
    'y' | 'yes') echo '[info] OK. push start.';;
    * ) echo '[error] push failed.';exit 1;;
esac
exit 0

設定

ホームディレクトリ直下に.git_template/hooksというディレクトリを作成し、その中に今回作成したHookのスクリプトを保存する。同じくホームディレクトリ直下にある.gitconfigにtemplatedirとして(以下のファイル参照)登録すれば、次回から、git initするたびに、自動的にhooksディレクトリ下のファイルがそれぞれの.git/hooks配下にコピーされて有効になるはずだ。また、現在のlocal repositoryに対して有効にするには、git initをもう一度おこなうだけでよい。この記事によれば、

既存のプロジェクトの場合は.git_template/hooksの内容をそれぞれ反映させる必要があります。
再度git initを実行するとhooksが再インストールされます。ただし、すでに同ファイル名のものが存在する場合は上書きはされないようなので、

.git/hooks/のファイルを削除してからgit initする必要があるらしい。
少し前のことなのでうろ覚えだが、こちらを参考に初期設定を行なったと思うので参考にするといいと思う。

.gitconfig
[init]
        templatedir = ~/.git_template

まとめ

git hooksを用いて、確認しながらcommitしてみた。branch情報の取得だったり、ubuntuで書いたsedを含むコードがmacではうまく動かなかったり(ここを参考に修正した)で、少し苦労したが、なんとかなってよかった。

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