$ HOMEをシンボリックリンクポイントファイルの代わりにgitに入れるのに落とし穴がありますか?

$ HOMEをシンボリックリンクポイントファイルの代わりにgitに入れるのに落とし穴がありますか?

$HOME私は長年私のカタログ全体をSubversionとして確認してきました。これには、私のすべてのドットファイルとアプリケーション設定ファイル、多くのスクリプト、ツールとハッキング、私のお気に入りのデフォルトのホームディレクトリ構造、かなり多くの奇妙なプロジェクト、そしてランダムなデータストアが含まれます。これは良いことです。それが続く間。

しかし、状況が歩くことができなくなりました。基本的な検査は何十ものシステムで同じですが、これらすべてが私のすべてのコンピュータで動作するわけではありません。他のディストリビューションでもうまく機能しません。

私は家を掃除しています。データが属する場所を分離し、一部のスクリプトを別々のプロジェクトに分割し、自動化する必要がある項目で壊れたリンクを修正するなどの作業を行います。

subversion私の意図はトップレベルのgitチェックアウトを置き換えることですが、$HOMEすべてのシステムで使用したいものに縮小したいと思います。つまり、ドットファイル、いくつかのディレクトリ、およびいくつかのデフォルトのカスタムスクリプトを意味します。

オンラインで読むと、多くの人がこれを行うためにシンボリックリンク方法を使用しているようです。つまり、サブディレクトリに複製し、リポジトリ$HOMEからシンボリックリンクを作成します。$HOME私は10年以上にわたって完全なバージョン管理を受けてきましたが、このアプローチのアイデアも気に入らず、なぜ人々が直接チェックアウトアプローチにそのように反対するようなのか理解できません。git最高の支払いのために知っておくべき特定の問題はありますか$HOME

PS:良いコーディング練習の一環として、ルートチェックアウトをGitHubに公開する計画もあります。何も考えずに共有しなければならないファイルに、セキュリティに敏感な情報をどれだけ収集できるかを恐れています。 WiFiパスワード、暗号化されていないRSA鍵などこんな!

答え1

はいgit、とは関係のないホームディレクトリ管理を考慮すると、少なくとも1つの主な落とし穴がありますsubversion

基本的に、Gitは貪欲で再帰的です。

Subversionは知らないことは無実に無視し、不明な(または他のリポジトリに属する​​)フォルダに到達すると、チェックアウトから上下にフォルダの処理を停止します。一方、Gitはすべてのサブディレクトリで繰り返されるため、ネームスペースの問題によりネストされたチェックアウトが非常に複雑になります。ホームディレクトリは他のさまざまなGitリポジトリをチェックして作業する場所である可能性が高いので、ホームディレクトリをgitに入れると人生が混乱することはほとんど確実です。

これは、人々がドットファイルを別のフォルダとしてチェックし、そのファイルにシンボリックリンクをリンクする主な理由であることがわかりました。自宅で転倒するかどうかを確認することは純粋に好みの問題ですが、$HOMEgitを使用している場合は必須です。

しかし、、代替ソリューションがあります。 Gitでは、すべてのストレージシステムが、チェックアウト作業ディレクトリから物理的に分離できる代替フォルダに隠されている「偽のルート」という機能を許可します。その結果、gitツールキットは混同されません。リポジトリも表示できず、作業コピーのみを表示できます。いくつかの環境変数を設定すると、ホームディレクトリを管理するときに必要な項目を見つける場所をgitに尋ねるように求められます。環境変数が設定されていないと、誰も賢明ではなく、あなたの家は古典的なファイル自体のように見えます。

この技術をよりスムーズにするためのいくつかの素晴らしいツールがあります。これvcs-homeメーリングリスト事実上の出発点になるように見える情報ページは、方法と人々の経験を簡単にまとめます。その過程で、次のようないくつかの素晴らしいデバイスがあります。VCSH神社。ホームディレクトリをgitに直接保持するには、vcshはほとんど必須のツールです。ホームディレクトリをバックグラウンドで複数のリポジトリに分割する場合は、すばやく簡単に複数のリポジトリを組み合わせて一度に管理しますvcshmr

答え2

私は私のホームディレクトリ全体をバージョン管理にチェックインしたくありません。これは、私が入るすべてのサブディレクトリが私のホームディレクトリのバージョン管理コンテキストを持つことを意味するからです。この場合、このようなコマンドはgit checkout実際の作業を実行し、誤って間違ったディレクトリから何かを実行すると問題を引き起こす可能性があります。それがそれgit自体であれ、gitを呼び出すスクリプトであろうとは関係ありません。

また、不要なコンテンツをリポジトリに追加する可能性が高くなります。誤って秘密鍵ファイルを追加して(おそらく習慣的に)それをgithubにプッシュした場合はどうなりますか?

しかし、私の考えの最大の欠点は、技術的なものではなく、単に私の方法から抜け出したかったということです。

シンボリックリンクの場合は、リポジトリをサブディレクトリに複製し、スクリプトを使用して更新が必要なシンボリックリンクを更新できます。ただし、このスクリプトに必要なメンテナンスは、これによって得られる利点よりも大きくなり、労力を減らすことができます。

シンボリックリンクを使用すると、配布別(またはホスト別)のコンテンツを簡単に追加してgitにチェックインすることもできます。シンボリックリンク更新スクリプトは、互換性のないプラットフォームまたは他のホスト上のファイルを無視し、適切なファイルのみを更新します。

それは次のとおりです。

HOMEREPO=$HOME/homerepo
HOST=$(hostname)
UNAME=$(uname)

for dotfile in $HOMEREPO/shared/* $HOMEREPO/host-$HOST/* $HOMEREPO/uname-$UNAME/*
do
    target=$HOME/$(basename $dotfile)
    [ ! -r $target ] && ln -s $dotfile $target
done

個人的には、私はシンボリックリンクディレクトリを使用せず、その中にあるファイルだけを使用します。これにより、これらのディレクトリでサイトローカルの変更(ファイルの追加と削除など)を実行できる柔軟性が得られます。すべてのシンボリックリンクを手動で再生成する必要があるため、新しいシステムで自分のアカウントを設定するのは非常に退屈でした。

答え3

別の視点を提示すると、私はしばらくgitの下に$ HOMEを入れてきましたが、何の欠点も見つかりませんでした。私は明らかにこのgit repoをgithubに同期しません。私はプライベートストアを持つサービスを使用します。また、メディアファイル、ダウンロード、またはパッケージをgit制御下に置かないでください。

  • git status「やるべきこと、掃除すること」のリストです。

  • 私は~/tmp無視される一時的なものを持っています。

  • 私は最近インストールしたソフトウェアが私の$ HOMEに追加されるのを見て、しばしばgit statusこれらのファイルを削除したり、犯人を削除したりするのが好きです。

  • 私は本当に便利なローカルファイルとディレクトリを手動で追加しました.gitignore

  • 新しい仮想マシンを構築したり新しいPCをインストールしたりする場合は、リモートホームディレクトリを$ HOMEに複製するだけで、必要なものをすべてすぐに入手できます。

  • vimプラグインvundleのようなものはもう必要ありません。

私は複雑なものが好きではありません。 rcfileを調整するときにこれを行い、コミットしてプッシュします。その後、反省して一日で$ HOMEをインポートし、常に最新の設定を維持します。とても簡単です。

現在この状態のコンピュータ:家庭用ラップトップ、仕事用PC、仕事用VM、3〜4台のリモートサーバー。

答え4

以下は1つです:これを試してリポジトリの最初のコミットがチェックgit rebase -i --rootインされると、gitはファイルを一時的に削除し、結果としてリベースジョブを完了するには名前とEメールが必要になり、リベースジョブを完了できなくなります。 。ファイルに保存されているもの。.gitconfig.gitconfig

再構成して実行できますが、git rebase --continueそうしてリベースが完了した後、私のgitリポジトリはそのコミットの前にコミットメッセージなしで空のコミットを受け取りました。これはリポジトリ提出の最初のコミットでした。よくわかりません。それを削除する方法。

git rebase -i <commit>このようにして.gitconfigそれ以降にコミットを確認すると、何が起こるのかわかりません<commit>

おそらく最も簡単な解決策は、.gitconfigリポジトリに追加せずに代わりに.gitignore

関連情報