4

要件のタイトルを短くする方法がわかりません。意味がない場合は申し訳ありません。ここで説明します:

多くの人は、ドットファイルをbitbucketまたはgithubに配置して、後でインストールまたは構成しやすくするために、別のPC間で同期します。私も同じことをしましたが、何か特別なことをしたいのですが、mecurial/gitがどのように役立つかわかりません。

私が持っているもの:

私は3台のマシン、たとえばHome、Office、Clientを持っており、すべてLinux OSです(異なるディストリビューションである可能性があります)。例を簡単にするために、1つのファイル.zshrcをリポジトリに入れたいとしましょう。問題は、3つのOSのシステム変数(またはその他の設定)が異なることです。例えば

  • OfficeにJBOSSがインストールされているので、.zshrcJBOSS_HOME変数をエクスポートする必要があります。
  • クライアントにOracleがインストールされている場合は、さまざまな変数のセットをエクスポートします。
  • OfficeはHTTP_PROXYをエクスポートする必要がありますが、HOMEはエクスポートしません。クライアントもそれを必要としますが、プロキシ値が異なります。

今私がしたことは、それらのマシン固有の設定(主にエクスポート、エイリアスステートメント)を別のファイル、たとえばに抽出することmyVar.shです。の最後にソースを設定し.zshrcます。

したがって、3台のマシンには共通の部分(同じ.zshrc)と異なる部分(myVar.sh)があります。

私が欲しいもの:

  • どのマシンでも、良い設定が見つかったら、.zshrcファイル(共通部分)を変更してプッシュします。変更は、他のマシンと簡単に同期できる必要があります(たとえば、プルによって)

  • myVar.shHOMEの(別の部分)を変更してプッシュmyVar.shしても、OfficeマシンをプルしてもOfficeには影響しません。

私がしていること:

これで、bitBucketに1つのリポジトリがあり、3つのブランチ(H、O、C)があります。Home PCでは、Homeブランチで遊んでいます。Office、Clientについても同じです。

問題は、1台のPCで共通部分を変更した場合、その変更はそれ自体のブランチにあり、他の2台と同期するのが少し難しいことです。私はそれらのブランチをマージすることは決してないからです。

また、PCごとに異なるディレクトリをmkすることも考えています。例えば

/.zshrc
|--/HOME/myVar.sh
|--/Office/myVar.sh
|--/Client/myVar.sh

myVar.shシェルスクリプトを記述します。たとえば、$ HOSTをチェックして、どのディレクトリへの書き込みを決定します。しかし、それが私の目標を達成するための最良の方法であるかどうかは疑問です。そして、ドットファイルのディレクトリを見ると、3個すべての設定が表示されます。注意して、ファイルを読み取るために正しいものを入力する必要があります。

現実の世界では、共通部分には.zhsrc(tmux、vimrc、xdefault ..)よりもはるかに多くのものが含まれているため、別の部分も含まれます。

どういうわけか、リポジトリで部分的なブランチを作成したり、部分的なマージを実行したりできるかわかりません...

私はgitよりもはるかに多くのhgを使用していますが、hgで解決できる場合は、hgを使用します。そうでない場合は、gitも使用できます。クローン、プッシュ、プル、アップ、マージ、ciを除いて、Gitの経験はあまりありません。

さて、どうすればいいですか?

そして、これを読んでくれてありがとう...


別の部分についてもっと編集する

答えてくれてありがとう。上で述べたように、私の実際のマシンの別の部分は、ほど単純ではありませんmyVar.sh。たとえば、会社のラップトップ(Office)をさまざまなクライアントに移動し(約6つのクライアントがあり、すべてのクライアントがPCを提供しているわけではありません。どこでもLinuxで作業できるので便利です)、それぞれのプリンターをカップごとに構成します。私もそれらの構成をリポジトリに入れます。ある日、システムを更新する必要がある場合、またはハードディスクに障害が発生した場合、それらのプリンターを非常に簡単にセットアップできたからです。別の部分に属する他のものですが、私は単に「xxxをソース」することはできません

  • トラックポイントのXorg.conf

  • .hgrcファイル(会社には独自のリポジトリ、uid、pwd、proxyがあります。)

  • いくつかの事前設定されたsystemdモジュール、基本的には.confファイル。ただし、マシン固有です。たとえば、自宅のラップトップ専用のradeon.confです。また、クライアントPCにはsystemdがまったくインストールされていません。

    そのため、PC用に別のディレクトリを考えました。

私が今言ったように、私は3つのブランチを持っており、myConfこのディレクトリ内にgetConf.sh、ドットファイルやさまざまなconfなどをコピーするためのディレクトリがありmyConfます。実際、getConf.shスクリプトはすべてのPCで同じではないため、は別の部分にも属しています。

したがって、この場合、 if-else/switchthenは機能しない可能性があると思います。source

昨日、私は.zshrcを取得して、例を単純にしようとしました。それがあなたたちを誤解させるなら、それについて申し訳ありません。

4

4 に答える 4

5

これを行うための私の好ましい方法は、各ファイルのホスト固有のバージョンをすべて同じディレクトリに配置することです。同じファイルの複数のディレクトリと同様に、変数補間を介してメインファイルに含めます。だからこれ~/.bashrcの中にこれがあります:

if [ -f ~/.bashrc-$HOSTNAME ] ; then
     source ~/.bashrc-$HOSTNAME
fi

おそらくそれはzshでさらにきれいですが、ホスト固有のファイルが存在する場合はそれを最後にソースし、もちろんすべてのマシンに適用されるものはすべてメインの〜/.bashrc自体に入れられます。

于 2013-01-16T21:03:28.387 に答える
0

同様の問題が発生し、対応するファイルを分岐することで解決しました。

PATHこれは、Macと他のコンピューター(内部.bashrc)に異なる値をエクスポートする方法を示す小さな例です。

MAC=0
if [ -x "/System/Library/CoreServices/Finder.app/Contents/MacOS/Finder" ]; then
  MAC=1
fi

if [ $MAC -eq 1 ]; then
  export PATH=~/bin/:/sw/bin:$PATH
else
  export PATH=~/bin/:/sbin/:$PATH
fi

同様のことが許可されている場合.zshrcは、これが役立つ可能性があります。そうでない場合は、コンピューターごとに異なるファイルを使用し、それらを個別に更新します(おそらく、いくつかの共有パーツに基づいてこれらのファイルを生成するスクリプトを使用しますか?)。

于 2013-01-16T21:08:50.390 に答える
0

まあ、純粋な Mercurial 中心のソリューション

  1. 古典的な分岐

追加の「バニラ」ブランチから開始する、ホストごとのブランチ (そこに共有コードを保存します)。その後、各ブランチでホスト固有の変更を行います。共通の変更 (および共通の変更のみ) はバニラ ブランチに表示され、残りのブランチにマージされる必要があります。

  1. MQ パッチ

単一の分岐、p.1 の Vanilla と同じ目的 (「変更セットには共通のベースが含まれる」)。すべての変更可能なホスト固有の変更は、mq-patch の一連のキュー (または、新しい Mercurial の場合はキュー) に保存されます。パッチスタックをどのように整理するかは、完全にあなたの責任範囲です:

  • 一部の異なるパッチが別のパッチのクローンであっても、ホストごとに 1 つのキューと完全なパッチ セットを使用できます (名前ベースの分離)。結果: ホスト用の実際のファイルセットを準備するための簡単な操作。すべての NAME-* パッチを適用する必要があります。
  • 機能の分離: 各パッチは単一のタスク (BOSS、ORACLE、PROXY、PROXY-CONFIG...) に対応します。結果: パッチの削減、ブロックからのファイルの論理的な結合、内部ロジックを変更することなく、より広いホストセットに拡張可能
  • 個別のキュー: 各ホストには独自のキューがあります。結果: 「外部」パッチがホストに適用されることはありません。欠点 - キュー間でより困難な (または不可能な) パッチ交換が行われ、バージョン「フル セット」のように機能的なクローンが作成されます (実際には、「フル セット」をより強力に分離したバリエーションです)。
于 2013-01-16T23:02:59.517 に答える
0

あなたがやっているように、独自のブランチで各設定を管理できます。それぞれの共通ファイルを追跡するサブモジュール (レポ内のレポ) を追加できます。それらを同期するには、次のことができます

git checkout otherbranch -- path/to/common/script && git submodule update

セットアップするには、次のようにします。

ホーム ディレクトリに .gitignore ファイルを追加します。* が付いているものはすべて無視します。そのエントリの後、たとえば !.ssh/ で保持したいドット ファイルを除外します。

これをレポにするのは簡単です。

git init repostart
mv repostart/.git .
rm -rf repostart
git add .gitignore .ssh
git commit -m "initial start of syncing my settings"

これで、.ssh/ のすべての変更が追跡されます。あなたの場合、必要に応じて .bashrc と .bash_profile または他のパスを除外できます。

これで、たとえば github や bitbucket (無料のプライベート リポジトリの場合) からプッシュおよびプルする標準的な手順に従うことができます。

git remote add origin <url to bitbucket repo>
git push -u origin master

これで、サーバー上で設定が完了しました。他のマシンで:

cd ~
git clone <path to your settings> settings
mv settings/.git . 
rm -rf settings
git pull origin master -t

-t および -u オプションはトラッキングをセットアップするので、

git push
git pull

bitbucket サーバーとの間で設定を取得または保存する必要がある場合。

リポジトリの共通部分を同期するために、progit.org/book でサブモジュールに関するこの短い章を読むことができます。第 6 章セクション 6 を参照してください。

于 2013-01-16T17:46:41.757 に答える