Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 11631] ファイルの概要

このコミットは、Go言語プロジェクトのバージョン管理システムにおける無視ファイルリストである.hgignoreから、もはや不要となったエントリ("dregs"、つまり残りかすや不要物)を削除するものです。これは、プロジェクトのビルドプロセスや開発環境の変化に伴い、特定の生成ファイルや一時ファイルが生成されなくなった、あるいはその管理方法が変わったことを反映しています。

コミット

commit d31d9201d6a962b8f6402850de22b72e09097309
Author: Rob Pike <r@golang.org>
Date:   Mon Feb 6 11:09:38 2012 +1100

    .hgignore: delete dregs
    
    R=golang-dev, dsymonds
    CC=golang-dev
    https://golang.org/cl/5634045

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/d31d9201d6a962b8f6402850de22b72e09097309

元コミット内容

.hgignore: delete dregs

変更の背景

このコミットが行われた2012年2月時点では、Go言語プロジェクトは主にMercurial (hg) という分散型バージョン管理システムを使用していました。.hgignoreファイルは、Mercurialが管理するリポジトリにおいて、バージョン管理の対象から除外するファイルやディレクトリのパターンを定義するために使用されます。これはGitにおける.gitignoreに相当します。

"dregs"(残りかす)の削除というコミットメッセージは、プロジェクトのビルドシステム、開発ツール、またはコード生成プロセスが進化し、以前は生成されて無視する必要があったファイルが、もはや生成されなくなったか、あるいはその場所や命名規則が変更されたことを示唆しています。不要なエントリを.hgignoreから削除することで、ファイルのリストが整理され、将来的な混乱を防ぎ、リポジトリのクリーンさを保つことができます。

具体的には、Goプロジェクトは後にMercurialからGitへ移行しましたが、このコミットはその移行以前のMercurial運用中に発生したものです。当時のGoのビルドプロセスは、C言語で書かれた部分(src/cmd/cc, src/cmd/gcなど)や、ランタイム(src/pkg/runtime)のビルドに関連する一時ファイルや生成ファイルを多く含んでいました。これらのファイルは通常、ソースコードではないためバージョン管理の対象外とされ、.hgignoreに登録されていました。

前提知識の解説

Mercurial (.hgignore)

Mercurialは、Gitと同様に分散型バージョン管理システムです。.hgignoreファイルは、Mercurialリポジトリのルートディレクトリに配置され、Mercurialが追跡すべきではないファイルやディレクトリのパターンを記述します。これにより、コンパイル済みバイナリ、ログファイル、一時ファイル、IDEの設定ファイルなどが誤ってリポジトリにコミットされるのを防ぎます。パターンは通常、シェルグロブ形式または正規表現で記述されます。

Go言語の初期のビルドシステム

Go言語の初期のビルドシステムは、現在のGoツールチェーンとは異なり、より多くのC言語のツールやスクリプトに依存していました。例えば、src/cmd/ccsrc/cmd/gcは、それぞれCコンパイラとGoコンパイラに関連するディレクトリであり、これらはビルド過程で中間ファイルや出力ファイルを生成していました。src/pkg/runtimeはGoランタイムのソースコードを含み、アセンブリコード(.sファイル)やCコードから生成されるヘッダファイルなどが存在しました。

Make.deps

Make.depsのようなファイルは、Makeシステムにおいて依存関係を追跡するために生成されることが多いです。ソースファイルが変更された際に、どのオブジェクトファイルやターゲットを再ビルドする必要があるかをMakeが判断するために使用されます。ビルドプロセスが変更され、Make以外のビルドシステム(例えば、Go自身のビルドツール)が使われるようになった場合、これらの依存関係ファイルは不要になります。

runtime.acid.*

runtime.acid.*のようなパターンは、特定のツールやプロセスによって生成される一時ファイルやデバッグ関連のファイルを指す可能性があります。例えば、acidは特定のデバッグツールやプロファイリングツールに関連する接頭辞である可能性があります。これらのファイルが生成されなくなった場合、.hgignoreから削除されます。

asm.h

asm.hは、アセンブリコードから生成されるヘッダファイルである可能性があります。Goのランタイムは、パフォーマンスが重要な部分でアセンブリコードを使用しており、これらのアセンブリファイルからC言語のコードが利用できるようなヘッダファイルが生成されることがあります。ビルドプロセスの変更により、これらのヘッダファイルの生成方法や命名規則が変わったか、あるいはもはや生成されなくなった可能性があります。

技術的詳細

このコミットでは、.hgignoreファイルから以下の4つのパターンが削除されています。

  1. src/pkg/Make.deps:

    • これは、GoプロジェクトのビルドプロセスがMakeベースの依存関係管理から、Go自身のビルドツール(go buildなど)に移行したことを強く示唆しています。Make.depsはMakeファイルが依存関係を自動生成する際に使用するファイルであり、Makeシステムが不要になれば、このファイルも生成されなくなり、無視する必要がなくなります。
  2. src/pkg/runtime/*/asm.h:

    • src/pkg/runtimeディレクトリはGoランタイムのコードを含んでいます。*/asm.hというパターンは、runtimeディレクトリ内のサブディレクトリ(例えば、特定のアーキテクチャごとのディレクトリ)に存在するasm.hという名前のファイルを指します。これは、アセンブリコードから生成されるヘッダファイルである可能性が高いです。Goのビルドシステムが進化し、これらのヘッダファイルの生成方法が変わったか、あるいはもはや生成されなくなったため、無視リストから削除されたと考えられます。例えば、Goのツールチェーンが直接アセンブリファイルを処理し、Cヘッダを生成する必要がなくなった、あるいは生成されるファイル名が変わったなどが考えられます。
  3. src/pkg/runtime/runtime.acid.*:

    • このパターンは、src/pkg/runtimeディレクトリ内のruntime.acid.で始まるすべてのファイルを指します。acidという接頭辞は、特定のデバッグツール、プロファイリングツール、または内部的なテストハーネスに関連する一時ファイルや出力ファイルを示唆している可能性があります。これらのツールやプロセスが変更または廃止されたため、関連する一時ファイルが生成されなくなり、.hgignoreから削除されたと推測されます。
  4. src/pkg/runtime/runtime_defs.go:

    • このファイルは、Goランタイムの定義を含むGoソースファイルである可能性があります。通常、Goのソースファイルはバージョン管理下に置かれますが、もしこのファイルが何らかのツールによって自動生成され、かつその生成プロセスが変更されたり、ファイル自体が不要になったりした場合は、.hgignoreから削除されることがあります。例えば、以前はCのヘッダファイルからGoの定義を自動生成していたが、そのプロセスが変更された、あるいは定義が直接Goのソースコードに記述されるようになった、などが考えられます。

これらの変更は、Go言語プロジェクトが成熟し、ビルドシステムや開発ワークフローがより洗練されたものへと進化している過程の一部を示しています。不要なエントリを削除することで、バージョン管理のオーバーヘッドを減らし、リポジトリの健全性を維持しています。

コアとなるコードの変更箇所

--- a/.hgignore
+++ b/.hgignore
@@ -37,21 +37,17 @@ src/cmd/cc/y.output
 src/cmd/gc/mkbuiltin1
 src/cmd/gc/opnames.h
 src/cmd/gc/y.output
-src/pkg/Make.deps
 src/pkg/exp/norm/maketables
 src/pkg/exp/norm/maketesttables
 src/pkg/exp/norm/normregtest
 src/pkg/exp/ebnflint/ebnflint
 src/pkg/go/build/syslist.go
 src/pkg/go/doc/headscan
-src/pkg/runtime/*/asm.h
 src/pkg/runtime/arch_GOARCH.h
 src/pkg/runtime/defs_GOOS_GOARCH.h
 src/pkg/runtime/goc2c
 src/pkg/runtime/mkversion
 src/pkg/runtime/os_GOOS.h
-src/pkg/runtime/runtime.acid.*
-src/pkg/runtime/runtime_defs.go
 src/pkg/runtime/signals_GOOS.h
 src/pkg/runtime/version.go
 src/pkg/runtime/version_*.go

コアとなるコードの解説

上記の差分は、.hgignoreファイルから4行が削除されたことを示しています。

  • -src/pkg/Make.deps: この行の削除は、GoプロジェクトのビルドシステムがMakeベースの依存関係管理から脱却したことを意味します。Goは独自のビルドツール(go buildなど)を持っており、プロジェクトが成熟するにつれて、これらのネイティブツールがMakeに取って代わったと考えられます。これにより、Make.depsファイルはもはや生成されなくなり、無視リストから削除されました。
  • -src/pkg/runtime/*/asm.h: この行の削除は、Goランタイムのアセンブリコードに関連するヘッダファイルの生成プロセスが変更されたことを示唆しています。以前はsrc/pkg/runtime以下の各アーキテクチャディレクトリ(*の部分)にasm.hというファイルが生成され、それが無視されていましたが、ビルドシステムの変更により、このファイルが生成されなくなったか、あるいは別の命名規則や場所に移動したため、無視する必要がなくなりました。
  • -src/pkg/runtime/runtime.acid.*: この行の削除は、runtime.acid.で始まるファイルがもはや生成されなくなったことを意味します。これは、特定のデバッグ、プロファイリング、またはテスト関連のツールやプロセスが変更または廃止された結果である可能性が高いです。これらのファイルは一時的なものであり、生成されなくなれば無視リストから削除するのが適切です。
  • -src/pkg/runtime/runtime_defs.go: この行の削除は、runtime_defs.goというファイルがもはや自動生成されなくなったか、あるいはその内容が他の場所に統合されたことを示唆しています。もしこのファイルが以前はツールによって生成され、バージョン管理から除外されていたのであれば、その生成プロセスが変更されたか、ファイル自体が不要になったため、無視リストから削除されました。

これらの削除は、Goプロジェクトのビルドと開発環境が進化し、より効率的でクリーンな状態になったことを反映しています。不要な無視パターンを削除することで、リポジトリの管理が簡素化され、開発者が混乱する可能性が低減されます。

関連リンク

  • Go言語公式ウェブサイト: https://go.dev/
  • Mercurial公式ウェブサイト: https://www.mercurial-scm.org/
  • GoプロジェクトのMercurialからGitへの移行に関する議論(参考情報として、このコミットの後の出来事ですが、当時の背景を理解するのに役立ちます):

参考にした情報源リンク