まだプログラマーですが何か?

プログラマーネタ中心。たまに作成したウェブサービス関連の話も https://twitter.com/dotnsf

タグ:git

社内ネットワークに Proxy サーバーが設置されている環境は珍しくないと思いますが、そのような環境下でパブリッククラウドを利用して開発作業を行ったり、アプリケーションをデプロイする際に Proxy 環境に応じた設定が必要になります(ついでにいうと、そのような環境下では特定ポート以外を通さない設定になっていることも多いので、単なる Proxy 対応だけでは不十分なこともあります)。

実際にそのような環境でのお客様対応を通じて苦労した得た情報を設定手順含めて共有します。なお以下は IBM Cloud を使ったケースとして紹介していますが、そこそこ広くパブリッククラウド利用時に役立つ情報だと思っています。


【Proxy 環境下で git コマンドを使う】
コマンドプロンプトやターミナルを開いて以下を入力します:
$ git config --global http.proxy http://my.proxyserver.com:8080

$ git config --global https.proxy http://my.proxyserver.com:8080


なお http://my.proxyserver.com:8080 部分は Proxy サーバー名およびポート番号です(以下も同様)。


【ssh でなく https で github(gitlab) を使う】
これは Proxy とは直接関係ないのですが、ssh プロトコル通信が閉じられているような環境下でプライベートな github(gitlab) リポジトリを使いたい場合の、つまり https プロトコルでプライベートな github(gitlab) リポジトリを使う場合に必要な設定項目です。 作業内容としては Private Access Token を設定することで https でも認証が可能になり、プライベートリポジトリを利用することができるようになります。以下 github を使う前提での画面で紹介しますが、gitlab でもほぼ同様です。

まず github にログインし、画面右上の "Settings"  を選択します:
2020022801


次に画面左の "Developer Settings" を選択します:
2020022802


Developer Settings のメニューから "Personal access tokens" を選択し、画面右の "Generate new token" ボタンをクリックします:
2020022803


新たに生成するトークンの設定を指定します。まず名前を(myToken など)適当に入力し、scopes を選択します(わからなければとりあえずは全部):
2020022804


そして最後に画面下部にある "Generate token" ボタンをクリック:
2020022805


すると以下のような画面になり、トークン文字列が表示されます。この文字列はこの一回しか表示されません(一度異なるページを表示した後に再度表示する方法は用意されていません)。別ファイルにコピーするなどしてこの値を再度入力できるようにしてください:
2020022806

ここまで完了していれば、以下のコマンドで https プロトコルだけで github から git clone ができます:
$ git clone https://github.com/aabbcc/xxyyzz.git
 Username: (GitHub のユーザー名)
 Password: (取得したトークン文字列)

なお gitlab の場合は以下のようになります:
$ git clone https://gitlab.com/aabbcc/xxyyzz.git
 Username: oauth2
 Password: (取得したトークン文字列)

【Proxy 環境下で npm コマンドを使う】
サーバーサイド JavaScript である Node.js を使ってアプリケーションを開発する場合、ほぼ npm コマンドを併用することになると思っています。この npm コマンドを Proxy 環境下で使う場合にも設定が必要です。
$ npm -g config set proxy "http://my.proxyserver.com:8080/"
$ npm -g config set https-proxy "http://my.proxyserver.com:8080/"
$ npm -g config set registry "http://registry.npmjs.org/"

proxy と https-proxy の設定をすれば動くはず、ですが、この2つだけではエラーになることがあるらしいです。その場合は registry も設定してください。


【Proxy 環境下で cf コマンドを使う】
これは IBM Cloud 環境に特化した設定かもしれませんが、PaaS である Cloud Foundry ランタイムにアプリケーションを push(デプロイ)する際に利用する cf コマンド(ibmcloud cf コマンド)も Proxy 環境下ではそのための環境設定をしないと使うことはできません。

※Delivery Pipeline サービスを利用することで、cf コマンドを使わずに Git と連動してデプロイすることは可能です。


具体的には環境変数の設定を行う必要があります。以下は Windows 10 での環境変数設定方法です。

コントロールパネル - システムとセキュリティ - システム - システムの詳細設定 を選択します:
2020022807


「詳細設定」タブの「環境変数」ボタンをクリック:
2020022808


ユーザー環境変数で「新規」ボタンをクリック:
2020022809


新しいユーザー変数として、以下の2つを設定します:
変数名変数値
http_proxyProxy サーバー URL
https_proxyProxy サーバー URL

20200228010


2つの環境変数が新たに追加されていることを確認します:

20200228011


これで cf コマンドを指定した Proxy サーバー経由で実行することができるようになりました。

令和最初のブログエントリです。


Node.js アプリの中で git を使う方法を調べてみました。git で Node.js のソースコードを管理する、のではなく、アプリケーションの中で特定の git リポジトリに対して clone したり、pull したり、add して commit して push したり、、、といった操作を Node.js アプリ側から行う方法、という意味です。

この操作を実現するためのライブラリとして simple-git というものを使ってみました。npm を使って以下のコマンドを実行することで導入できます:
$ npm install simple-git

2019050201


そして、以下のコードで扱う git リポジトリは https://github.com/dotnsf/simple-git-sample.git であると仮定します。異なるリポジトリで実験する場合は( fork してコピーを作るなどして)適宜読み替えてください。またローカル側のワーキングフォルダ(git で管理するフォルダ)は ./work/ であると仮定します。


【初期化】
まず、このライブラリを使って Node.js アプリを作る際の初期化方法を紹介します(実はここが一番ややこしい所だったりします)。ここは「実行時に git clone して初期化」するのか、「実行時に git pull して初期化」するのかによって手順が異なります。

実行時に git clone して初期化する場合は以下のようにします:
//. git-clone.js
var git = require( 'simple-git' );

var git_url = 'https://github.com/dotnsf/simple-git-sample.git';
var local_folder = 'work';


//. clone
git().clone( git_url, local_folder );

このコードを node コマンドで実行すると、work/ というフォルダが新規に作成され、https://github.com/dotnsf/simple-git-sample.git のクローンがそのフォルダの中に作成されます。

一方、実行時に git pull して初期化する場合は以下のようにします:
//. git-pull.js
var git = require( 'simple-git' );

var git_url = 'https://github.com/dotnsf/simple-git-sample.git';
var local_folder = 'work';


//. pull
git( local_folder ).pull();

このコードを node コマンドで実行すると、既にワーキングフォルダとして存在している ./work/ フォルダの中に最新のリポジトリ状態が git pull されます。

ここでややこしいのが「どちらを使って初期化するべきか?」です。既にワーキングフォルダ ./work/ が存在している状態で git clone を実行するとエラーになってしまうし、一方ワーキングフォルダが存在していない状態では git pull してもエラーとなってしまうからです。というわけで、以下のように実行すべきだと思いました:
//. git-init.js
var git = require( 'simple-git' );
var fs = require( 'fs' );
var path = require( 'path' );

var git_url = 'https://github.com/dotnsf/simple-git-sample.git';
var local_folder = 'work';

//. フォルダの存在確認
var dirname = path.dirname( './' + local_folder );
fs.access( dirname, fs.constants.R_OK | fs.constants.W_OK, ( err ) => {
  if( err ){
    //. clone
    git().clone( git_url, local_folder );
  }else{
    //. pull
    git( local_folder ).pull();
  }
});

ワーキングフォルダが存在しているかどうかを確認し、存在していなかった場合は git clone を、存在していた場合は(git clone 済みと解釈して)git pull を、それぞれ実行して初期化しています。


【ファイル追加】
次にこの(初期化済みの)ライブラリを使って、リポジトリにファイルを追加する方法を紹介します。厳密にいうと「(git pull して、)git add して、git commit して、git push する」までの一連の方法を紹介します。

といっても、実は結構簡単でこんな感じで一連の処理を実現できます:
//. git-push.js
var git = require( 'simple-git' );
var fs = require( 'fs' );
var path = require( 'path' );

var git_url = 'https://github.com/dotnsf/simple-git-sample.git';
var local_folder = 'work';

//. pull, add, commit, and push
git( local_folder ).pull()
  .add( 'README.md' )
  .commit( 'README.md updated.' )
  .push( [ '-u', 'origin', 'master' ] );

add() のパラメータに追加したいファイル名、commit() のパラメータにはコミットメッセージ、そして push のパラメータにはオプションを指定します(この例だと $ git push -u origin master を実行しているのと同じ処理をしています)。


実際にはブランチ切ったり、マージが必要になったりすることもあるので、全ての git 処理を全自動でというのはなかなか難しい所もあると思いますが、一連の決まった処理を(例外処理無しで)実現するにはシンプルで便利なライブラリだと思いました。


GitHub で作成してしばらく使っていたリポジトリが、当初の想定以上に盛り上がったりすると、最初に適当に付けたリポジトリ名からちゃんとした正式名称のリポジトリに変更したくなる(というか、した)、という経験をしました。その時の作業手順メモです。

まず最初の注意点として、GitHub リポジトリのリネームは GitHub サーバー側と、そのクローンを保持するローカル側の両方で行う必要があります。クローンを保持するローカルが複数ある場合は、その全てのローカル側で対応が必要になります。

今回は
 https://github.com/dotnsf/old_app.git

 https://github.com/dotnsf/new_app.git
にリネームする想定で以下を説明します。

【GitHub サーバー側】
サーバー側の変更は GitHub のリポジトリ画面内から行います。まずブラウザでリポジトリページを開き、"Settings" メニューを選択します:
2018061401


"Settings" メニューのすぐ下に "Repository name" フィールドがあり、ここに変更前のリポジトリ名(今回であれば "old_app")が入力されています:
2018061402


ここを新しいリポジトリ名称(今回であれば "new_app")に変更し、"Rename" ボタンをクリックして確定させます:
2018061403


サーバー側の変更はこれだけです。この時点で名称変更前の URL にアクセスしても自動的に新しい URL にフォワードされて、新しい名前のリポジトリが表示されます:
2018061404



【ローカル側】
クローンしたローカルリポジトリ内の .git/config ファイルを編集します:
  :
  :

[remote "origin"]
        url = https://github.com/dotnsf/new_app
        fetch = +refs/heads/*:refs/remotes/origin/*

  :
  :

[remote "origin"] 項目内の url の値を新しいリポジトリの URL に変更して保存します。ローカル側の変更もこれだけですが、複数のマシンにローカルリポジトリが存在する場合は全てのローカルリポジトリを変更します。



ここまでの作業でサーバー側&リモート側ともリポジトリのリネーム作業が完了しました。当然ですが、中身は変わってない(リネーム前のまま)ので、改めてリネーム後に変更が必要なファイル(README.md とか)を更新してください:
2018061405


 

Java で Git のリポジトリを操作するライブラリに JGit があります:
http://www.eclipse.org/jgit/
2016082801


現在は Eclipse 参加のサブプロジェクトとして提供されています。すごく便利な反面、ちょっとクセがあります。以下、基本的な使い方を説明しますが、まずは前提をいくつか:

【前提】
(1) 対象とする Git のリモートリポジトリ URI は http://xxxgit.com/name/project.git とします。
(2) 上記リポジトリにアクセス(特にプッシュ)する際の認証は ID: username, Password: password であるとします。
(3) ローカルリポジトリ(上記リポジトリをローカルにクローンする先)のディレクトリは ./project (つまりカレントディレクトリ上に project というサブディレクトリを作る)とします。


【準備】
JGit のダウンロードページから最新版の JGit をダウンロードし、展開して JAR を取り出し、自分のプロジェクト内に(Classpath を通すなどして)用意します。

ここまで用意できれば JGit を使うことができます。以下、一通りの git 操作(clone, pull, add, commit, push)を行う様子を順に紹介します。


【git clone】
目的のリモートリポジトリ(今回の例では http://xxxgit.com/name/project.git)からコードをクローンします:
try{
  Repository localRepo = new FileRepository( "./project/.git" );
  Git git = new Git( localRepo );

  if( git != null ){
    //. git clone
    git.cloneRepository().setURI( "http://xxxgit.com/name/project.git" ).setDirectory( new File( "./project" ) ).call();
  }
}catch( Exception e ){
  e.printStackTrace();
}

以下全ての例に言えることですが、ローカルリポジトリのインスタンス変数を作る際に指定するのは、ローカルリポジトリのフォルダに "/.git" をつけたものです。

一方、クローン実行時に指定するローカルフォルダはローカルリポジトリのフォルダそのものです。この辺りがクセのある所で、知らないと混乱します。


【git pull】
クローンしたローカルリポジトリに対し、リモートリポジトリに加えられている最新の変更を反映させます:
try{
  Repository localRepo = new FileRepository( "./project/.git" );
  Git git = new Git( localRepo );

  if( git != null ){
    //. git pull
    PullCommand pc = git.pull();
    pc.call();
  }
}catch( Exception e ){
  e.printStackTrace();
}

JGit では各コマンドを実行する際には ****Command クラスの(上記例では PullCommand クラス)インスタンスを作って、必要であれば設定を加えて、call() する、という処理を実行します。

そして次の add コマンドを実行する前に、このローカルリポジトリ内のファイルに何らかの変更が加わっていることを想定してください。


【git add】
ローカルリポジトリ内のファイルシステムに対して行った変更作業をリポジトリに加えます:
try{
  Repository localRepo = new FileRepository( "./project/.git" );
  Git git = new Git( localRepo );

  if( git != null ){
    //. git add
    AddCommand ac = git.add();
    ac.addFilepattern( "." );  //. 全ての変更を git add する
    try{
      ac.call();
    }catch( NoFilepatternException e ){
      e.printStackTrace();
    }
  }
}catch( Exception e ){
  e.printStackTrace();
}

AddCommand インスタンスにファイルパターンを指定して call() する、という手順です。


【git commit】
ローカルリポジトリの変更内容をコミットします:
try{
  Repository localRepo = new FileRepository( "./project/.git" );
  Git git = new Git( localRepo );

  if( git != null ){
    //. git commit
    CommitCommand cc = git.commit();
//. コミッターの名前とメールアドレス、コミットメッセージを指定 cc.setCommitter( "commiter_name", "committer_email" ).setMessage( "Some message." ); try{ cc.call(); }catch( NoHeadException e ){ e.printStackTrace(); }catch( NoMessageException e ){ e.printStackTrace(); }catch( ConcurrentRefUpdateException e ){ e.printStackTrace(); }catch( WrongRepositoryStateException e ){ e.printStackTrace(); } } }catch( Exception e ){ e.printStackTrace(); }

コミッターの名前とメールアドレス、そしてコミットメッセージを追加した上で call() します。


【git push】

ローカルリポジトリの変更内容をリモートリポジトリに対してプッシュします:
try{
  Repository localRepo = new FileRepository( "./project/.git" );
  Git git = new Git( localRepo );

  if( git != null ){
//. git push CredentialsProvider cp = new UsernamePasswordCredentialsProvider( username, password ); PushCommand pc = git.push(); pc.setCredentialsProvider( cp ).setForce( true ).setPushAll(); } }catch( Exception e ){ e.printStackTrace(); }

認証用の usernamepassword を指定してプッシュする、という流れです。


以上、JGit を使った基本的な git コマンドの実行方法を紹介しました。クセがある、と紹介しましたが、ある程度慣れてしまえばそんなに苦ではないと思います。何よりもプログラムから git が使えると複製機能をこれで実装できたりするのですごく便利です。

個人/仲間で作ったアプリのソースコードを管理したり、サンプルアプリ的なものを作ってそのコードを公開したりしようとすると、GitHub は非常に便利です。私も色々な形で使っています。

ただ、GitHub でソースコードを管理すると基本は誰からもソースコードが見れるように公開する形になります。GitHub でプライベート管理をすることは可能ですが、その場合は有償アカウントに切り替える必要があります。業務で使うケースでは(少なくとも開発中は)ソースコードを公開したくない、というケースも珍しくないと思うので、ソースコードをどうやってプライベート管理するか、という問題が生じます。自分も最近ありました。

自分の場合は自分で SubversionGitLab 環境を構築して使っています(両方使っています)。この中の GitLab は GitHub 互換のリポジトリ管理や問題トラッキングの環境を(Community Edition であれば)無料のオープンソースで構築することができるようになります。GitHub 互換なので、git コマンドを使ってソースコードをコミットしてプッシュして・・・という GitHub と同じ管理ができます。git コマンドに慣れた人には非常に便利です。 というわけで、この GitLab 環境を CentOS 上に構築する手順をまとめてみました。

【あらかじめ用意しておくもの】

SSH 鍵のペア。作成方法はこちらを参照:



【導入&設定手順】

GitLab の導入自体は用意されたインストールパッケージを実行するだけなので非常に簡単です。まずは Community Edition のダウンロードページへ行き、自分の環境にあった最新版 GitLab Community Edition のパッケージを選んで導入することになります:
https://packages.gitlab.com/gitlab/gitlab-ce
2015122401
 ↑ラズベリーパイ向けのもパッケージもあるのか・・・


ちなみに、2015/Dec/24 時点では 8.3.0 が最新バージョンでした。このバージョンではオートマージ機能が追加されているようです:
https://about.gitlab.com/2015/12/22/gitlab-8-3-released/


例えば自分の場合であれば 64bit 版の CentOS 6 を使っているので、"el6" と書かれた最新版の rpm パッケージの箇所をクリックすると、以下の様な導入のインストラクションが表示されます。ここに書かれている通りに CentOS 環境からコマンドを実行してインストールします:
2015122402


モジュールインストール後に、環境設定が必要です。具体的には GitLab に自分自身の URL を認識させる必要があります。root 権限で /etc/gitlab/gitlab.rb ファイルを編集し、external_url に自分自身の IP アドレス(以下 'XXX.XXX.XXX.XXX')を設定して保存します:
# vi /etc/gitlab/gitlab.rb
: : external_url 'http://XXX.XXX.XXX.XXX' # 'http://gitlab.example.com' から自分の IP アドレスに書き換え : :

これだけで動かすこともできます。が、この状態で使うと色々不都合が生じることもあります。以下はそのためのオプショナルな設定を加える場合についていくつか紹介します。

まずはこのまま使うとユーザー追加時にメール認証(新規に追加したユーザーにメールが送られて、そのメール内のリンクをクリックしたら本登録)が必要になります。そのためにはメールサーバーとその設定/管理を・・・ ということになりますが、プライベートリポジトリ目的だけで使うのであれば、メール認証(というかメールサーバー管理)が面倒なので、その手順をスキップさせることもできます(その場合は /opt/gitlab/embedded/service/gitlab-rails/app/models/user.rb ファイルをカスタマイズして、ユーザーの登録と同時にメール認証が済んでいるかのように振る舞わせることになります)。テキストエディタで同ファイルを開いて、"class User" で始まる行以降に default_value_for で始まる行が数行続いているはずですが、その最後に以下の一行を追加してください:
# vi /opt/gitlab/embedded/service/gitlab-rails/app/models/user.rb
: : class User < ActiveRecord::Base : : default_value_for :admin, false : : default_value_for :confirmed_at, Time.now # この一行を追加 : : : :

また、CentOS の環境によっては GitLab が使う git ユーザー(セットアップ時に作成されているはずです)に ssh アクセスが許可されていないこともあります。その解除のためには以下の2ファイルを編集する必要があります。

1つ目は /etc/shadow を編集して、パスワードを設定していないユーザーの SSH アクセスを許可してあげてください:
# vi /etc/shadow
: : git:!!:16793::::::  (こっちから)   ↓ git:*:16793::::::   (こっちに変更) : :

もう1つは /etc/ssh/sshd_config を編集して、SSH を許可するユーザーに git を追加した上で sshd をリロードします:
# vi /etc/ssh/sshd_config
: : AllowUsers xxxx yyyy git  (AllowUsers に git を追加) : :

# service sshd reload

以上の内容は環境依存の箇所もありますが、必要に応じて設定してください。

この状態で GitLab を reconfigure します。reconfigure にはしばらく時間かかりますが、"Runnning handers complete" と表示されれば無事成功、これで設定調整は完了です:
# gitlab-ctl reconfigure
  :
  :
  :
  :
Running handlers:
Running handlers complete
Chef Client finished, 211/281 resources updated in 01 minutes 30 seconds
gitlab Reconfigured!

ここからは作成した GitLab 環境に実際にログインしての作業になります。まずはウェブブラウザで GitLab サーバー(http://XXX.XXX.XXX.XXX/)にアクセスしてみます:
2015122403


初期ページが表示されれば一応動いていることになります。まずは管理ユーザーを有効にするため、ユーザーID(root) と初期パスワード(5iveL!fe)を指定してログインします。パスワードはすぐに変更するのでここでは記憶させる必要はありません:
2015122404


ログインに成功すると、とりあえず初期パスワードを変える必要があります。初期パスワード(5iveL!fe)と、新しい管理者用パスワード(確認のため2回)を指定して、新しいパスワードを登録してください:
2015122405


直後に再度ログイン画面に戻るので、ユーザー ID(root) と新しいパスワードを指定してログインしてください:
2015122406


ログイン後にこんな画面が表示されれば、とりあえず初期設定は完了です:
2015122407



【ユーザー追加手順】

自分1人でソースコード管理をするのであれば、このまま管理者権限で作業を続けてもいいのですが、多くのケースでユーザー管理をすることが多いと思います。そこで作業用のユーザーを登録して、以降はその作業ユーザーによるプロジェクト管理を行っていく内容を紹介します。

ユーザーを新規に登録するには、root で GitLab にログインした状態から、ダッシュボード右上の Admin Area をクリックします:
2015122401


続いて NEW USER ボタンをクリックします:
2015122402


新規に登録するユーザーの名前、ユーザー名(ログインID)、そしてメールアドレスを入力して CREATE USER ボタンでユーザーを作成します(この時点ではパスワードは登録しません):
2015122403


これで一般ユーザーの作成が行われました:
2015122404



メールサーバーが正しく設定されていて、メール認証が有効になっている場合は、指定したメールアドレスにメールが送られ、その本文内のリンクからパスワード設定を含めた本登録を行うことになります。

上記で紹介した手順でメール認証を無効にした場合は、このユーザーの初期パスワードを手動で登録してあげる必要があります。上記画面右上の EDIT ボタンをクリックして、初期パスワードを登録してあげてください:
2015122400


では、改めてこのユーザーでログインしてみます。root で GitLab にログインしている場合はダッシュボード右上の Sign out からログアウトしてください:
2015122406


改めて GitLab サーバーにアクセスして、今度は作成した一般ユーザーの ID とパスワードでログインします:
2015122407


一般ユーザーでログインできることを確認してください:
2015122408


このまま、このユーザー向けの SSH 鍵を登録しましょう。ダッシュボード左メニューから Profile Settings を選択します:
2015122401


続いて SSH Keys をクリックします:
2015122402


登録済み SSH 鍵の一覧が表示される画面ですが、この時点ではまだ何も登録されていないので表示されません。ではあらかじめ用意した SSH 鍵を登録してみます。ADD SSH KEY ボタンをクリックします:
2015122403


テキストエリアが表示されるので、この中に用意した公開鍵の内容をペーストします。また Title 欄に名前を付けて、最後に ADD KEY ボタンをクリックします:
2015122404


このユーザーが使える SSH 鍵が登録できました:
2015122405


同様にして、必要なユーザーと、そのユーザーの SSH 鍵を必要なだけ登録しておきます。


【プロジェクト追加手順】

では一般ユーザーでプロジェクトを追加してみます。ソースコードの管理をするにもまずはそのプロジェクトを作成する必要があります。

GitLab ダッシュボードに一般ユーザーでログインした後に、Project(初期状態でここが選ばれているはずです)の NEW PROJECT ボタンをクリックします:
2015122401


なお、一度プロジェクトを作成した後の二度目以降は画面右上の New Project をクリックしてください:
2015122408


プロジェクトの名前(下図では myhelloworld)や Description を入力後、Visivility Level に Private を指定すると(パブリックではない)プライベートなリポジトリを作ることができます。最後に CREATE PROJECT ボタンをクリックしてプロジェクトを作成します:
2015122402


GitLab 上にプロジェクト myhelloworld が新規に作成できました:
2015122403


画面を下にスクロールすると、この後のコマンド操作方法についての簡単なガイドが紹介されています。必要に応じて参照してください:
2015122404


このプロジェクトに他のユーザーをメンバー登録すると、そのユーザーからもこの Git リポジトリが使えるようになります。プロジェクト画面左の Members を選ぶと、GitLab ユーザーをプロジェクトメンバーに追加する画面に切り替わります:
2015122405


People にカーソルを持って行くと、GitLab 上のユーザー一覧が表示されます。ここから選んで指定することができます:
2015122406


プロジェクトに追加したい人と、その権限を指定し、ADD USERS TO PROJECT ボタンをクリックすると、そのユーザーは指定した権限でプロジェクトメンバーとして追加されます:
2015122407


この図では Administrator ユーザーが Master 権限でプロジェクトに追加されたことが分かります:
2015122408


これを必要なだけ繰り返して、プロジェクトにメンバーを追加します。



【プロジェクトの Git リポジトリを git クライアントから操作する手順】

ではこの myhelloworld プロジェクトの Git リポジトリを実際に使ってみましょう。まずは適当なファイル1つをコミット&プッシュしてみます。

まずは作業マシン上に git クライアントを導入しておきます。作業マシンが CentOS や RedHat であれば以下のコマンドで導入できます:
# yum install git

また、登録した SSH 鍵の秘密鍵ファイル(ファイル名 guestkey とします)を利用ユーザーの ~/.ssh/ 以下に用意しておきます。そして ~/.ssh/config ファイルを以下の内容で作成します:
Host mygitlab-server
        HostName XXX.XXX.XXX.XXX  (GitLab サーバーのIPアドレス)
        IdentityFile ~/.ssh/guestkey  (秘密鍵ファイル)
        User dotnsf  (GitLab サーバーのログインユーザー名)

そして鍵ファイルと config ファイルのパーミッションを 600 に設定します:
$ chmod 600 ~/.ssh/guestkey
$ chmod 600 ~/.ssh/config

では SSH の準備が整ったので、実際に git コマンドを使ってみます。まずは Global 設定で user.name と user.email を設定します:
$ git config --global user.name "K.Kimura"
$ git config --global user.email "xxxx@xxxxx.com"

まだ最初のコミット前なので、ゼロからリポジトリの中身を作る必要があります。というわけで専用のディレクトリを1つ作り、その中にプロジェクトのファイルを追加します。ここではとりあえずホームディレクトリ以下に myhelloworld というサブディレクトリを作り、その中に README.md ファイルを1つ追加しました(ソースコードなどを加える場合も myhelloworld 以下に追加していくことになります):
$ cd 
$ mkdir myhelloworld
$ cd myhelloworld
$ echo '# MyHelloWorld' > README.md

この myhelloworld ディレクトリを git リポジトリとして GitLab サーバーの myhelloworld プロジェクトにコミット&プッシュします(以下は myhelloworld ディレクトリで行います):
$ git init
$ git remote add origin git@mygitlab-server:dotnsf/myhelloworld.git
$ git add .
$ git commit -m 'first commit'
$ git push -u origin master

最後の git push 実行時に「接続を続けますか?」というプロンプトが表示されたら 'yes' と入力してください。また途中でパスフレーズの入力をするよう求められた場合は登録した SSH 鍵ファイルを作成した時に指定したパスフレーズを入力してください。成功するとこのような画面になるはずです:
$ git push -u origin master
The authenticity of host 'XXX.XXX.XXX.XXX (XXX.XXX.XXX.XXX)' can't be established.
RSA key fingerprint is aa:bb:cc:dd:ee:ff:gg:hh:ii:jj:kk:ll:mm:nn:oo:pp
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'XXX.XXX.XXX.XXX' (RSA) to the list of known hosts.
Enter passphrase for key '/home/linux1/.ssh/guestkey': (SSH 鍵のパスフレーズを入力)
Counting objects: 3, done.
Writing objects: 100% (3/3), 222 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@mygitlab-server:dotnsf/myhelloworld.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.
$

この状態で GitLab サーバー上の myhelloworld プロジェクトを見ると、このコミット&プッシュが記録されて、以下のようになるはずです:
2015122401


画面左の Files をクリックすると、現在の Git リポジトリのファイル一覧(まだ README.md しかないので1つだけ)が確認できます。これでプライベート Git リポジトリが作成できました:
2015122402


同じユーザーでも、別ユーザーでもいいのですが、このリポジトリを操作する場合の手順も紹介しておきます。上記のグローバル設定を行うまでは共通です(同一ユーザーで行う場合は myhelloworld ディレクトリごと削除してから以下を行ってください)。その上で GitLab サーバーの myhelloworld リポジトリをクローンします。途中でパスフレーズの入力を求められた場合は同様に SSH 鍵ファイル作成時に指定したパスフレーズを入力してください:
$ cd (作業ディレクトリに移動 指定しない場合はホームディレクトリ)
$ git clone git@mygitlab-server:dotnsf/myhelloworld.git
Initialized empty Git repository in /home/linux1/src/myhelloworld/.git/
Enter passphrase for key '/home/linux1/.ssh/guestkey': (SSH 鍵のパスフレーズを入力)
remote: Counting objects: 3, done.
Receiving objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
$

この時点でカレントディレクトリに myhelloworld というディレクトリが作られ、その中に現在の myhelloworld リポジトリの内容がクローンされているはずです:
$ cd myhelloworld
$ ls -a
.   ..   .git   README.md


この中に以下の内容で index.php ファイルを追加します(名前は何でもいいし、どのような内容でも構いませんが、新規にファイルを作って追加してください):
$ echo '<?php echo "ハローワールド!\n"; ?>' > index.php

追加したファイルを GitLab のリポジトリにコミットしてプッシュします:
$ git add .
$ git commit -m 'index.php added.'
$ git push -u origin master
  (SSH 鍵のパスフレーズを入力してプッシュ)

ここまでの作業が成功すると、GitLab の myhelloworld プロジェクトのファイル一覧はこのようになり、index.php が追加された状態になります:
2015122403


「新規に作成してコミット&プッシュ」も、「クローンして作業してコミット&プッシュ」もできることがわかりました。



GitLab Community Edition を使えば、無料でプライベートな Git リポジトリを作って管理する、ということもできそうです。GitLab Community Edition にはラズベリーパイ用のモジュールも用意されているようなので、余った(?)ラズパイの使いみちとしても良さ気な感じです。


このページのトップヘ