joppot

コピペで絶対動く。説明を妥協しない

ソフトウェア

emacs25上でvcを使ってgit管理する

投稿日:2018年1月18日 更新日:


概要

みなさんこんにちはcandleです。今回はemacsでデフォルトで入っているvc(version controll)を使って見たいと思います。
vcはgitに特化した機能ではなくsubversion とgit両方に対応したものらしいです。

本格的にemacsでgitを使いたい方はmagitの方をオススメします。
一方、vcはデフォルトで組み込まれているので、簡単に使いたい方に向いています。


前提

emacsを使っている
gitが、ある程度使える。

emacsのvc-git設定

vcはgitに対応しているものの、git add とgit unstagedがありません。
理由はよくわかりませんが、おそらく、gitとsubversion両方に対応させようとしてそうなったのでしょう。

それでは使いづらいので、設定を加えて、使えるようにしましょう。

この設定はvc gitの公式からも紹介されている以下の記事を参考にしました。
しかし、記事のままではemacs25ではうまく作動しなかったので、少し手を加えています。

Emacs vc-git tweaks

emacsの設定ファイルを開きます。

emacs .emacs.d/init.el

以下を記述します。

[lisp]
(require ‘vc-dir)
;; In vc-git and vc-dir for git buffers, make (C-x v) a run git add, u run git
;; reset, and r run git reset and checkout from head.
(defun my-vc-git-command (verb fn)
(let* ((fileset-arg (or vc-fileset (vc-deduce-fileset nil t)))
(backend (car fileset-arg))
(files (nth 1 fileset-arg)))
(if (eq backend ‘Git)
(progn (funcall fn files)
(message (concat verb " " (number-to-string (length files))
" file(s).")))
(message "Not in a vc git buffer."))))

(defun my-vc-git-add (&optional revision vc-fileset comment)
(interactive "P")
(my-vc-git-command "Staged" ‘vc-git-register))

(defun my-vc-git-reset (&optional revision vc-fileset comment)
(interactive "P")
(my-vc-git-command "Unstaged"
(lambda (files) (vc-git-command nil 0 files "reset" "-q" "–"))))

(eval-after-load "vc-dir"
‘(progn
(define-key vc-prefix-map [(r)] ‘vc-revert-buffer)
(define-key vc-dir-mode-map [(r)] ‘vc-revert-buffer)
(define-key vc-prefix-map [(a)] ‘my-vc-git-add)
(define-key vc-dir-mode-map [(a)] ‘my-vc-git-add)
(define-key vc-prefix-map [(u)] ‘my-vc-git-reset)
(define-key vc-dir-mode-map [(u)] ‘my-vc-git-reset)

;; hide up to date files after refreshing in vc-dir
(define-key vc-dir-mode-map [(g)]
(lambda () (interactive) (vc-dir-refresh) (vc-dir-hide-up-to-date)))
))
[/lisp]
保存しましょう。

gitレポジトリの作成

適当なフォルダを作成し、その中にindex.htmlを作りたいと思います。

mkdir vcproject
cd vcproject
touch index.html
git init
git add .
git commit -m "first commit"

これでindex.htmlだけがあるgitリポジトリができました。


emacs vcを使う

emacsでindex.htmlを開き、以下を書き込んで保存しましょう。

<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8"/>
    <title>Document</title>
  </head>
  <body>
    <p>hello</p>
  </body>
</html>

バッファーのファイルの差分を確認する

現在、index.htmlを開いている状態で、このフィアルの差分を表示して見ます。
以下のコマンドを実行するかショートカットをタイプします。

実行
M-x vc-diff
ショートカット
C-x v =

全体の変更状況を確認する

git で言う所のgit statusコマンドに対応するのが、vc-dirです。
これを実行すると、gitリポジトリ下全ての変更を確認できます。

現在、index.htmlにタグを追加したのが確認できます。

実行
M-x vc-dir
ショートカット
C-x v d

どのディレクトリのgitの差分を表示するか聞かれます。
基本的にはエンターを押せば良いです。

どのよな変更があったか分かります。

カーソルをファイル名の所に移動して、エンターを押すと、そのファイルに移動できます。

変更をgit addする

先にも書いたように、vc gitにはデフォルトでgit addがありませんが、上の記述で実行できるようになっています。
git addする方法は2種類あります。

バッファーからgit addする

変更がなされているindex.htmlファイルを開いて、以下のコマンドを実行しましょう。

実行
M-x my-vc-git-add
ショートカット
C-x v a

vc-dirからgit addする

もう1つの方法はvc-dir画面から行います。
vc-dirを開いて、

実行
M-x vc-dir
ショートカット
C-x v d

ステージにあげたいファイルのところにカーソルを合わせて、以下を実行します。

実行
M-x my-vc-git-add
ショートカット
C-x v a

またはファイル名の前で「a」とタイプするだけでgit addできます。

ファイル名の前ではなくて、上の方で、C-x v aを実行すると、全ての差分が、indexにaddされます。
残念ながら、そのファイルがindexに上がっているかどうかを確認するすべはemacsではできないので、CUIで直接gitを叩くか、gitupなどの別のguiツールを使う必要があります。

新規ファイルを登録する

ここが、特にvcでgitを使うときに分かりにくい部分なのです。
新しくファイルを作成した場合、vcはvc-register関数でそのファイルをgit addします。
しかし、このgit addはファイルを新規作成した場合にのみ使うコマンドで、既にあるファイルの差分をgit addする場合は上のmy-vc-git-addを使います。逆に、新規ファイルに対してmy-vc-git-addしてもgit上ではindexに登録されますが、vc上ではregisterされないので、コミットできません。

まとめると、新しくファイルを作成したら、vc-registerしましょうという事です。

試しにindex.cssを作成します。

touch index.css

vc-dirを実行するとindex.htmlとindex.cssの2つの状態を確認できます。

実行
M-x vc-dir
ショートカット
C-x v d

index.cssがunregisteredになっていることが確認できます。

カーソルをunregisteredの前に持っていき、vc-registerを実行します。
実行
M-x vc-register
ショートカット
C-x v i

状態が addedになりました。gitで言う所のgit add index.cssです。

git commitする

git commitはvc-next-actionになります。
これも2通りのコミットの仕方があります。
ファイルバッファー毎にコミットする

最初は試しにバッファ毎にコミットしみましょう。
vc-next-actionは差分をindexにあげてなくてもコミットできます。

また、上の画像の様に、複数ファイルの差分があってもバッファからコミットする場合は、そのバッファのみコミットされます。
index.htmlをemacs上に表示して、以下を実行しましょう。

実行
M-x vc-next-action
ショートカット
C-x v v

Summary: のところに、コミット文を入れます。

Write basic html tags


かけたら、C-c C-cをタイプすると、コミットされます。
もちろん、大規模アプリケーションともなると、ファイルを1つだけ変更してコミットする機会は減っていくと思います。

全ての変更をコミットする

今度はリポジトリ全体の差分をコミットしてみましょう。
index.htmlを変更して、index.cssを読み込む様にします。

<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8"/>
    <link href="./index.css" rel="stylesheet"/>
    <title>Document</title>
  </head>
  <body>
    <p>hello</p>
  </body>
</html>

現在の差分は新規作成したindex.cssとそれを読み込む記述をしたindex.htmlです。

リポジトリ全体をコミットしたい時はvc-dir上で実行する必要があります。

vc-dirを起動します。

実行
M-x vc-dir
ショートカット
C-x v d

カーソルの位置に気をつけてください。
カーソルをファイル名の前に置いて、vc-next-actionを実行するとそのファイルのみコミットされます。
カーソルをファイル名のところに合わせないで、以下を実行します。

実行
M-x vc-next-action
ショートカット
C-x v v

Summary: のところに、コミット文を入れます。

Include index.css

C-c C-cをタイプすると、コミットされます。

git addを取り消す

index.cssを開いて、スタイルを記述します。

body{
  color: #333;
}

vc-dirを開きます。

実行
M-x vc-dir
ショートカット
C-x v d

変更したファイルをgit addします。

実行
M-x my-vc-git-add
ショートカット
C-x v a

同じ要領で、カーソルをファイルの前に合わせて、以下を実行します。

実行
M-x my-vc-git-reset
ショートカット
C-x v u

またはファイル名の前で「u」をタイプするとunsageできます。

変更を削除する

gitで言う所のgit checkout index.cssですね。

これも2通りの方法で削除できます。
まずはバッファ上でやって見ましょう。
変更を削除したい、 ファイルをemacsに表示します。
今回ですと、index.cssの以下の記述を削除します。

body{
  color: #333;
}

実行
M-x vc-revert
ショートカット
C-x v r

本当に差分を削除していいのか聞いてくるので、yesかnoをタイプします。
yesと入力すれば、削除されます。

vc-dirから変更を削除する場合は、削除したいファイル名の前で、以下を実行します。

実行
M-x vc-revert
ショートカット
C-x v r

または、「r」をタイプします。

本当に差分を削除していいのか聞いてくるので、yesかnoをタイプします。
yesと入力すれば、削除されます。

過去のファイルの差分を確認する

例えば、index.htmlのログが見たいとしましょう。
emacsでindex.htmlを開いて、以下を実行します。

実行
M-x vc-print-log
ショートカット
C-x v l

履歴の中のコミットの部分でfキーを押すと、そのコミット時のファイルを確認できます。

これファイルは見れるは見れるんですが、
問題はそのファイルを見ると、同じディレクトリにファイルが作られてしまうという問題があります。

リポジトリ全体の履歴をみる

リポジトリ全体の履歴を見たい場合は以下のコマンドを実行します。

実行
M-x vc-print-root-log
ショートカット
C-x v L


まとめ

vc gitの基本的な使い方をまとめて見ました。
もちろん、本格的な運用はmagitを使った方が良いと自分も思います。
ただ、最低限使えると、便利だと思います。

スポンサードリンク

「為になったなぁ」と思ったら、シェアお願いします。

-ソフトウェア
-,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

Macのitermでスクロールバックを増やしたり無制限にする設定

概要 みなさんこんにちはcandleです。今回はitermのスクロールバックの制限を増やしたり、無制限にする方法を紹介します。 itermのスクロールバックできる量はデフォルトで確か、2000行だと思 …

wordpressでタグをボタンで挿入できる種類を増やす-AddQuicktag

概要 みなさんこんにちはcandleです。wordpressの記事を書いている時、 タグの挿入がもっと楽になれば便利なのにと思いました。私は記事の見出しはh3タグを使用しているのですが、h3タグのボタ …

Mac OSで使われているポート番号を確認する(portsscan)

概要 みなさんこんにちはcandleです。今回はMacで使われているポートの確認方法を紹介します。 ポート番号とはパソコンがインターネット(とは限らないのですが)、外部からのアクセスを受け付けている番 …

MAMPでphpのshell_execを使用してunixコマンドを実行できない場合の対処(imagemagick,convert)

概要 みなさんこんにちはcandleです。今回はちょっと問題が起きてshell_execがうまくいかないときのトラブルシューティングをまとめます。 私はMAMPをバージョンアップする前は、phpのsh …

vagrant1.8で共通の.vagrant.dにあるinsecure_private_keyプライベートキーを使用する

概要 みなさんこんにちはcandleです。今回はvagrantのプライベートキーの指定の仕方です。 vagrantは1.7か1.8でそれぞれのvagrantディレトリの中に生成されるプライベートキーを …


ベンチャー企業のCTOをやってます。大学時代にプログラミングを始め、javaから入門し、C++へて、PHPへと進み、会社ではRailsを使用。自動化が大好きなプログラマー