ファイルロック

解決できないマージ競合による無駄な作業を防ぐには、別の作業方法が必要です。つまり、書き込み権限を明示的に要求し、同じファイルを編集している人がいないことを事前に確認することです。

ブランチ戦略は通常、ソースコードやプレーンテキストでは、異なるバージョンをマージすることができるため、十分に機能しますが、バイナリファイルでは機能しません。

ファイルロックを設定すると、ロック可能なファイルはデフォルトで読み取り専用になります。

ファイルがロックされると、そのファイルをロックしたユーザーだけがそのファイルを変更できます。一度に 1 人のユーザーだけがファイルをロックできるため、このユーザーは「ロックを保持する」または「ロックを取った」と言われます。ファイルやディレクトリのロックが解除されると、そのユーザーは「ロックをリリースした」と言われます。

GitLabは2つの異なるファイルロックモードをサポートしています:

  • バイナリファイルの排他的ファイルロック:Git LFSと.gitattributesコマンドラインから実行し、ロックされたファイルがどのブランチでも変更されないようにします。
  • デフォルトブランチのロック:GitLab UIを通して行われ、ロックされたファイルやディレクトリがデフォルトブランチで変更されるのを防ぎます。

権限

リポジトリで開発者ロールを持っている人であれば、誰でもロックを作成できます。

ファイルやディレクトリをロックしたユーザーだけが、ロックされたファイルを編集できます。他のユーザーは、プッシュやマージなどの方法でロックされたファイルを変更することができず、次のようなエラーが表示されます:The path '.gitignore' is locked by Administrator.

排他的ファイルロック

このプロセスでは、単一のファイルやファイル拡張子をロックすることができ、コマンドラインから実行できます。GitLabの有料サブスクリプションは必要ありません。

Git LFSは、Gitリポジトリのストレージを減らすためにファイルを追跡するためによく知られていますが、ファイルをロックするためにも使うことができます。これは排他的ファイルロックに使われる方法です。

Git LFS のインストール

始める前に、Git LFS がインストールされていることを確認しましょう。ターミナルウィンドウを開いて実行します:

git-lfs --version

このコマンドを認識しない場合は、インストールする必要があります。インストールにはいくつかの方法があり、あなたのOSに合わせて選ぶことができます。Homebrewでインストールする場合:

brew install git-lfs

インストールしたら、ターミナルウィンドウでローカルリポジトリを開き、リポジトリに Git LFS をインストールしてください。LFS がすでにインストールされていることが確かなら、このステップは飛ばしても構いません。不確かな場合は、再インストールしても害はありません:

git lfs install

詳しくはUsing Git LFS を参照ください。

排他ファイルロックの設定

プロジェクトには、コマンドラインからメンテナーのロール Exclusive File Locks が必要です。

ファイルロックを使う前に最初にすべきことは、Git LFSにロック可能なファイルの種類を教えることです。次のコマンドでは、PNG ファイルを LFS に保存し、ロック可能なフラグを立てます:

git lfs track "*.png" --lockable

上記のコマンドを実行すると、.gitattributes という名前のファイルが以下の内容で作成あるいは更新されます:

*.png filter=lfs diff=lfs merge=lfs -text lockable

LFSを使用せずに、ファイルタイプをロック可能として登録することもできます(例えば、LFS File Locking APIを実装するリモートサーバーで必要なファイルをロック/アンロックできるようにするため)。そのためには、.gitattributes ファイルを手動で編集します:

*.pdf lockable

.gitattributes ファイルはプロセスの鍵であり、変更を有効にするにはリモートリポジトリにプッシュする必要があります。

ファイルタイプがロック可能なものとして登録された後、Git LFS はファイルシステム上でそれらを自動的に読み取り専用にします。つまり、ファイルを 編集する前にロックする必要があるということです。

ファイルのロック

ファイルをロックすることで、他の誰もそのファイルを編集していないことを確認し、あなたが編集を終えるまで、他の誰もそのファイルを編集できないようにします。一方、ファイルのロックを解除すると、編集が終わったことを伝え、他の人が編集できるようになります。

排他的ファイルロックを使用してファイルをロックまたはロック解除するには、リポジトリディレクトリでターミナルウィンドウを開き、Windows の説明に従ってコマンドを実行します。

ファイルをロックするには

git lfs lock path/to/file.png

ファイルのロックを解除するには

git lfs unlock path/to/file.png

また、ファイルID(ロックされたファイルを表示するときにLFSによって与えられる)によってロックを解除することもできます:

git lfs unlock --id=123

何らかの理由で、あなた自身がロックしていないファイルのロックを解除する必要がある場合、プロジェクトのメンテナー権限を持っている限り、--force フラグを使用できます:

git lfs unlock --id=123 --force

ロックされていてもロック解除されていても、ファイルを GitLab にプッシュすることができます。

note
マルチブランチのファイルロックは Git LFS コマンドラインインターフェイスで作成・管理できますが、ファイルロックはどのファイルに対しても作成することができます。

排他的にロックされたファイルの表示

ローカルで LFS でロックされたすべてのファイルを一覧表示するには、リポジトリでターミナルウィンドウを開いて実行します:

git lfs locks

出力されるのは、ロックされたファイルの一覧で、それぞれのファイルをロックしたユーザーとファイルのIDが続きます。

リポジトリのファイルツリー上で、GitLabはGit LFSによって追跡されたファイルにはLFSバッジを、排他的にロックされたファイルには南京錠アイコンを表示します:

LFS-Locked files

GitLab UI から既存のロックを見たり、削除したりすることもできます。

note
排他的にロックされたファイルの名前を変更すると、ロックは失われます。ロックを維持するには、再度ロックする必要があります。

ロック可能なファイルの編集

一度ロック可能なファイルとして設定されると、そのファイルは読み取り専用に設定されます。そのため、編集する前にロックする必要があります。

共有プロジェクトのための推奨ワークフロー:

  1. ファイルをロックします。
  2. ファイルを編集します。
  3. 変更をコミットしてください。
  4. リポジトリにプッシュします。
  5. 変更をレビュー、承認、マージします。
  6. ファイルのロックを解除します。

デフォルトのブランチファイルとディレクトリのロック

GitLab 8.9 で導入されました

このプロセスでは、GitLab UIから一度に1つのファイルをロックすることができ、GitLab PremiumまたはUltimateティアにアクセスする必要があります。

デフォルトブランチのファイルとディレクトリのロックは、プロジェクトの設定で設定されたデフォルトブランチにのみ適用されます。

デフォルトブランチでロックされたファイルへの変更は、ロックされたファイルを変更するマージリクエストも含めてブロックされます。変更を許可するには、ファイルのロックを解除します。

ファイルやディレクトリのロック

ファイルをロックするには

  1. GitLabでファイルやディレクトリを開きます。
  2. 右上、ファイルの上にあるLockを選択します。
  3. 確認ダイアログで、「OK」を選択します。

ファイルをロックする権限がない場合、ボタンは有効になりません。

ディレクトリをロックしたユーザー(あなたでない場合)を表示するには、ボタンにカーソルを合わせてください。ロックされたファイルに対する同様の機能の復活については、イシュー376222 で説明されています。

既存のロックの表示と削除

ファイルロックの表示と削除

  1. 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
  2. Code > Locked filesを選択します。

このリストには、LFS または GitLab UI を通してロックされた全てのファイルが表示されます。

ロックは作成者、またはメンテナー以上のロールを持つユーザーによって解除することができます。