ウェブサイト検索

Linux VPSでユーザー設定ファイルを管理するためのGitの使い方


ステータス: 廃止された

この記事では、もはやサポートされていないUbuntuのバージョンについて説明しています。現在、Ubuntu 12.04を実行しているサーバーを運営している場合は、サポートされているバージョンのUbuntuにアップグレードまたは移行することを強くお勧めします。

  • Ubuntu 14.04にアップグレードします。
  • Ubuntu 14.04からUbuntu 16.04へのアップグレード
  • サーバーデータをサポートされているバージョンに移行する

理由: Ubuntu 12.04は2017年4月28日にサポートが終了(EOL)し、もはやセキュリティパッチやアップデートを受けることはありません。このガイドはもはや維持されていません。

代わりに見る: このガイドは参考としてまだ役立つかもしれませんが、他のUbuntuリリースでは機能しない可能性があります。もし可能であれば、使用しているUbuntuのバージョンに対して書かれたガイドを使用することを強くお勧めします。ページの上部にある検索機能を使って、より新しいバージョンを見つけることができます。

紹介

Linuxマシンを使っていると、環境をかなりカスタマイズするようになるでしょう。テキストエディタのような一般的に使用されるアプリケーションは非常に設定可能で、未修正のバージョンがまったく異なるプログラムのように見えることさえあります。

設定を調整するにはかなりの作業が必要になることがありますし、時間の経過とともに使用状況が変わるにつれて、しばしば小さな編集を行うことになります。これを単一のコンピュータだけで管理するのは大変ですが、複数の機械で設定を同期させたい場合、状況は迅速に複雑で扱いにくくなります。

この記事では、複雑な設定ファイルを複数のマシンで共有するためのアプローチの一つについて説明します。重要なファイルを管理するためにgitバージョン管理を使用します。そして、これらをリモートリポジトリにアップロードし、他のコンピュータにそれらのファイルをダウンロードします。

これらのアイデアはUbuntu 12.04マシンでデモンストレーションしますが、gitの性質と使用する設定ファイルにより、適切に最新のLinuxディストリビューションでも同様に機能するはずです。

基本的な考え

このアイデアを実現するための実際の手順に入る前に、私たちが実際に何を設定するのかについて話しましょう。

あなたにはすでにいくつかの重い構成が進行中のコンピュータがあると仮定します。これが私たちが git リポジトリを構築するために使用するシステムです。適切なファイルをリポジトリに追加し、それからリモート git リポジトリにプッシュします。

リモートのGitリポジトリは、私たちの設定データを保存する場所になります。他の機械が私たちの設定ファイルを置く可能性があるため、すべての機械からアクセスできる必要があります。ファイルをホストするためにGitHubのような公共のスペースを利用している人もいますが、これは機密データを誤って世界中で読まれる場所にプッシュするリスクを伴います。

本ガイドでは、代わりにGitLabを使用します。これは、自分のマシンにインストールして使用できる自己ホスティングのgitリポジトリソリューションです。DigitalOceanは、プリコンフィグされたGitLab VPSを作成するためのワンクリックGitLabインストールイメージを提供しています。また、自分でGitLabをインストールする方法についても説明しますので、その方法を選びたい場合も対応できます。

構成ファイルがリモートのgitリポジトリにあるので、新しいシステムにファイルをプルして設定を適用できるようになります。

どの種類のファイルをコミットすべきですか?

新しいシステムで行うカスタマイズにはさまざまなレベルがありますが、このようなソリューションには特に適したファイルやカスタマイズの種類があります。

システム依存度が非常に高い値を持つファイルは、おそらく手動で処理するか、Chef、Puppet、またはAnsibleなどの構成管理システムを使用するなど、他の方法で処理されるべきです。

もしあなたが行っているカスタマイズがユーザーの好みに近いのではなく、システムの操作の詳細に近い場合、gitを使用してもあまり役に立たないでしょう。結局のところ、ほとんどの値をクライアントのシステムに合わせて変更する必要があります。

ツールとユーザー環境ファイルの設定は、このタイプのソリューションに最適です。vim、emacs、screen、tmux、bashなどのカスタマイズは、このタイプの設定にぴったりの候補です。

一般的に、良い指針としては、敏感な情報や機械依存の設定を含まない「ドットファイル」(ホームディレクトリ内にある隠し設定ファイル)は使用できます。GitHubの自己ホスト型代替であるGitLabのようなものを使用している場合は、敏感な情報を含むファイルを自己責任で含めることができます。

シードマシンの設定

私たちは、あなたが使用したい変更された設定ファイルを既に持っているコンピュータを「シード」マシンと呼びます。ここが私たちの設定ファイルの発信源となる場所です。

私たちは、実際に設定の同期を実装できるように、gitがインストールされていることを確認する必要があります。自分のディストリビューションが提供するリポジトリからgitをインストールしてください。Ubuntuの場合、これらのコマンドが機能するはずです:

sudo apt-get update
sudo apt-get install git

gitをインストールした後、コミットメッセージをクリーンに保つためにいくつかの設定を行うべきです。以下のコマンドには、自分の名前とメールアドレスを入力してください:

 git config --global user.name "あなたの名前" git config --global user.email "email@domain.com" 

この時点で、私たちは取ることのできるいくつかの異なるアプローチがあります。それぞれのアプローチについて順に説明させてください。この選択は、後でどのように進めるかに影響を与えます。

ホームディレクトリ全体をGitリポジトリとして使用する

おそらく私たちが持っている最も簡単なアプローチは、単にホームディレクトリ内にgitリポジトリを初期化することです。このアプローチは非常にシンプルで分かりやすいという利点がありますが、物事が進むにつれて混乱することがあります。

この方法は、次のようにタイプすることで始めることができます:

cd ~
git init

私たちのホームディレクトリ内にGitリポジトリが作成されます。ファイルの状態を見ると、「未追跡」とマークされたファイルがたくさんあることがわかります。

git status
On branch master
#
Initial commit
#
Untracked files:
  (use "git add <file>..." to include in what will be committed)
#
#	.bash_history
#	.bash_logout
#	.bashrc
#	.gitconfig
#	.profile
#	.screenrc
#	.ssh/
#	.viminfo
#	.vimrc
nothing added to commit but untracked files present (use "git add" to track)

gitが私たちのファイルをすべて認識しているのは良いことですが、ほとんどのファイルが「未追跡」と見なされ、毎回これを見るたびにこのような長いリストが作成されると、これをより多く使う時には非常に面倒です。

それが気にならなければ、次のように自分が追加したいファイルをgitリポジトリに追加できます:

git add .bashrc
git add .vimrc
. . .

もしGitのステータスをクリーンに保ち、役立ちそうな情報だけを提供したいのであれば、デフォルトですべてのファイルを無視するようにGitに指示できます。そして、バージョン管理に追加したいファイルについて例外を特に作成することができます。

これを行うには、すべてに一致するワイルドカードを持つ .gitignore ファイルをディレクトリに作成します:

echo "*" > .gitignore

これを行い、リポジトリの状態を確認すると、追跡するものが何もないことがわかります:

git status
On branch master
#
Initial commit
#
nothing to commit (create/copy files and use "git add" to track)

このシナリオでは、追加したいファイルを強制的に追加するために、-f フラグを使用する必要があります:

git add -f .bashrc
git add -f .vimrc
. . .

どちらにせよ、終了したら変更をコミットする必要があります:

git commit -m "Initial configuration commit"

ファイルを保存するための設定ディレクトリを作成する

ホームディレクトリ全体を含むGitリポジトリを作成するための別のアプローチは、これらのファイルを追跡するための専用のディレクトリを作成することです。

このチュートリアルの目的のために、このディレクトリをconfigsと呼びます。

cd ~
mkdir configs

このディレクトリに入って、ホームディレクトリの代わりにここでgitリポジトリを初期化できます。

cd configs
git init

現在、私たちはgitリポジトリを持っていますが、中にはファイルがありません。このディレクトリに私たちのファイルを入れ、バージョン管理システムでコミットできるようにしたいですが、プログラムが正しくそれらを見つけられるように、ホームディレクトリにもファイルを利用可能にしたいのです。

これら二つの目標を達成するための解決策は、ファイルをこのディレクトリにコピーし、その後メインディレクトリへのシステムリンクを作成することです。

各ファイルはこのようになります:

mv ~/.vimrc .
ln -s .vimrc ~/
mv ~/.bashrc .
ls -s .vimrc ~/
. . .

現在、私たちは実際の設定ファイルをすべて~/configsディレクトリに置いており、ホームディレクトリにはこれらのファイルへのシンボリックリンクがあります。

これはより複雑に聞こえるかもしれませんが、実際にはgitの側をかなり簡素化します。すべてのファイルを追加するには、単純に次のようにタイプできます:

git add .

そして、私たちは彼らをこのようにコミットすることができます:

git commit -m "Initial configuration commit"

このアプローチはgit側を簡素化しますが、おそらくファイルの実際の管理を少し複雑にします。

Gitディレクトリを作業ツリーから分離する

第三のアプローチは、ホームディレクトリ自体のバージョン管理に伴ういくつかの問題に対処しようとします。これは、実際のgitリポジトリをファイルを引き出す場所から分離します。

これは、ホームディレクトリを直接バージョン管理するというアイデアが好きですが、他のgitリポジトリとの関係で物事が複雑になると感じる場合に役立ちます。

基本的に、gitリポジトリを初期化すると、デフォルトで現在のディレクトリが作業ディレクトリと見なされ、チェックアウトがファイルを配置および変更する場所となります。このディレクトリに.gitと呼ばれるgitリポジトリが作成されます。

しかし、gitに別の作業ディレクトリを使用するように強制することができます。

私たちは前回の代替案と同様に、構成用の別のディレクトリを作成することから始めることができます:

cd ~
mkdir configs

再び、ディレクトリ内に移動してから、git リポジトリを初期化します:

cd configs
git init

物事がどのように変わるかを示すために、今の git status が何を言っているか見てみましょう。

git status
On branch master
#
Initial commit
#
nothing to commit (create/copy files and use "git add" to track)

現在、作業ディレクトリはリポジトリがある ~/configs ディレクトリです。ここにはファイルがないため、コミットするものがなく空になっています。

さて、私たちは少し異なる方法で物事を進めます。最初に、core.worktree git 設定オプションを使用して、別の作業ディレクトリを指定します:

git config core.worktree "../../"

これにより、.gitディレクトリのパスに対して作業ディレクトリが設定されます。最初の../は~/configsディレクトリを指し、2番目のものはそこからさらに一歩進んで私たちのホームディレクトリを指します。

基本的に、私たちはgitに「リポジトリをここに保管しなさい。しかし、あなたが管理しているファイルはリポジトリの2つ上の階層にある」と伝えました。

何が変わったかを見るために、もう一度ステータスを確認できます:

git status
On branch master
#
Initial commit
#
Untracked files:
  (use "git add <file>..." to include in what will be committed)
#
      ../.bash_history
      ../.bash_logout
      ../.bashrc
      ../.gitconfig
      ../.lesshst
      ../.profile
      ../.screenrc
      ../.ssh/
      ../.viminfo
      ../.vimrc
nothing added to commit but untracked files present (use "git add" to track)

gitが現在ホームディレクトリのファイルを参照していることがわかります。

私たちは今、ホームディレクトリに関連付けてファイルを追加できます。

git add ~/.vimrc
git add ~/.screenrc
git add ~/.bashrc
. . .

私たちは次のようにコミットできます:

git commit -m "Initial configuration commit"

ディレクトリ内では、後で情報を取得する必要がある場合にGitがすべての部分を再構築できるようにするために、/.gitファイルを配置する必要があります。

cd ~
nano .git

内部では、gitをリポジトリファイルに誘導するための一行が必要です:

 gitdir: /home/あなたのユーザー/configs/.git 

これにより、すべてがスムーズに動作するようになります。

リモートGitサーバーの設定

ニーズに応じて、ファイルを保存するためのリモートリポジトリを設定するためのさまざまなオプションがあります。

明らかな選択肢は、設定リポジトリをGitHubにプッシュすることです。これは一部の人々にとって素晴らしいアプローチかもしれませんが、機密データを誤って公開する可能性があることを忘れないでください。

これを避けたい場合は、自分のプライベートGitリポジトリにプッシュすることで、GitLabは素晴らしい選択肢です。

DigitalOceanでは、ワンクリックGitLabイメージを使用してすぐに始めることができます。

もう一つの選択肢は自分でGitLabをインストールすることです。このガイドでは、自分のサーバーにGitLabをインストールして設定する方法を説明します。

設定の方法に関係なく、リモートターゲットとして機能する新しい空のリポジトリを作成する必要があります。

空のリポジトリを作成すると、GitHubやGitLabはリポジトリに設定ファイルを追加する方法に関するコマンドが記載されたページを提供します。すでにSSHキーを追加していない限り、SSHの代わりにHTTPコマンドに切り替えるボタンをクリックしたいと思うでしょう。

これはこんな感じになります:

リモートリポジトリに設定を反映させるために、コマンドの提案を使用してください。おそらく、次のようなものになるでしょう:

 cd configs      # または「cd ~」を使用している場合は、ホームディレクトリに移動してください git remote add origin http://git_lab_ip/your_gitlab_user/repo_name.git git push -u origin master 

これにより、あなたの設定がGitLabリポジトリにプッシュされます。

リモートリポジトリからの構成を取得する

リモートリポジトリに設定ファイルが揃ったので、他のマシンからそれらをダウンロードできます。私たちが設定ファイルを追加したいサーバーは「ターゲット」マシンと呼びます。

ターゲットマシンにgitがインストールされていることを確認してください。Ubuntuでは、これは再び以下のように行います:

sudo apt-get update
sudo apt-get install git

これがインストールされたら、基本的な設定変数を再度設定する必要があります。

 git config --global user.name "あなたの名前" git config --global user.email "email@domain.com" 

次のステップは、このマシンがgitリポジトリのファイルとどのように対話するかによって再び決まります。

ホームディレクトリをバージョン管理下に置く

もしあなたがホームディレクトリ全体をgitのバージョン管理下に置きたい場合は、そこに空のgitリポジトリを始める必要があります。

cd ~
git init

ここから、このリポジトリの起源としてGitHubまたはGitLabのリポジトリを追加できます:

 git remote add origin http://git_lab_ip/your_gitlab_user/repo_name.git 

この点以降、リポジトリにある内容と衝突する可能性のあるファイルがすでにこのマシンにある場合は、少し異なる手順を踏む必要があります。例えば、通常、各ユーザーにはデフォルトで~/.bashrcファイルが含まれています。

1つの選択肢は、リポジトリのファイルと競合する各ファイルを削除または移動することです。しかし、リモートのバージョンで競合するすべてのファイルを上書きするようにgitに指示することもできます。

まずリモートファイルを取得し、その後、gitに最も最近のコミットにリセットするように指示することでこれを行うことができます。これが私たちのリモートバージョンになるはずです。

git fetch --all
git reset --hard origin/master

これにより、すべてのリモートファイルが私たちの新しいマシンに取り込まれるはずです。

このマシン上でファイルを簡単に変更し、それをリモートリポジトリにプッシュすることもできます。

echo "# a comment" >> .bashrc
git add .bashrc
git commit -m "test"
git push origin master

別の構成ディレクトリを使用する

実際の設定ファイルを保持するために別のディレクトリを使用したい場合は、そのファイルをホームディレクトリにリンクするだけで、リポジトリをクローンすることができます。

私たちは再びリモートリポジトリを指すURLが必要です。今回は新しいgitリポジトリを初期化するのではなく、ただクローンを使用します:

 git clone http://git_lab_ip/your_gitlab_user/configs.git 

さて、新しくクローンされたディレクトリに移動しましょう:

cd configs

これには私たちのすべての設定ファイルが含まれます。それらを個別にホームディレクトリにリンクすることができます:

ln -s .vimrc ~/
ln -s .screenrc ~/

再度、おそらく新しいファイルと競合するファイルを移動したり削除したりする必要があります:

rm ~/.bashrc
ln -s .bashrc ~/

これはより手動のプロセスですが、このコンピュータでアクティブにしたいファイルに対してより詳細な制御を持つことができます。

別々のGitリポジトリとディレクトリを実装する

私たちがシードマシンのために話し合った分離された作業ディレクトリとリポジトリの設定を実装するために、再度リポジトリをクローンすることができます。

この方法の違いは、リポジトリが直接私たちのホームディレクトリにファイルをアンロードすることを望んでいるため、クローン時にファイルをチェックアウトしないことです。

 git clone --no-checkout http://git_lab_ip/your_gitlab_user/configs.git 

さて、私たちはgitに、ファイルを~/configs/.gitディレクトリの二階上にあるディレクトリに展開したいことを伝える必要があります(ホームディレクトリ):

cd configs
git config core.worktree "../../"

さて、明示的にファイルをチェックアウトできます。再度、現在のファイルを上書きするためにgitを強制する必要があります。それは、リモートリポジトリからのファイルの状態に「リセット」することで実現できます:

git reset --hard origin/master

あなたの設定ファイルは今や新しいコンピュータで利用可能なはずです。

結論

これで、個人の設定ファイルをバージョン管理するためのいくつかのオプションが揃ったはずです。設定ファイルへの変更をリモートリポジトリに継続的にコミットすることで、リモートマシン上で環境の最も重要な部分を迅速かつ手間なく再現できるはずです。

ジャスティン・エリングウッドによる

関連記事: