〜をソース管理下に置くためのヒント


77

多くの設定ファイル(.gitconfig、.gitignore、.emacsなど)があるため、ホームディレクトリ(〜)をソース管理(この場合はgit)に配置したいので、マシン間で持ち運びたいそれらをGitに含めると、それらを取得するのに便利になります。

私のメインマシンは私のMacBookであり、OS Xのセットアップ方法には、無視したいフォルダーがたくさんあります(ドキュメント、ダウンロード、.ssh)。Git(.emacs.d)を既に使用しているフォルダーもあります。

私の考えは、これらすべてのディレクトリを.gitignoreファイルに追加することだけでしたが、それはちょっと面倒で、予想外の結果を招く可能性があります。私の次の考えは、保存したいファイルを定期的に家のあるフォルダーにコピーし、そのフォルダーをコミットすることでした。問題は、コミットする前にそれらを移動することを覚えておく必要があることです。

これを行うためのクリーンな方法はありますか?


また、必要なフォルダーのコミットを実行し、cronjobsを介して呼び出すスクリプトを作成することもできます。
シャドック

Mac OS XのデフォルトのHFS +ファイルシステムは大文字と小文字を区別しません(ただし、大文字と小文字を保持します)。また、ファイルパスはユーザー空間で標準的に分解されたUTF-8でエンコードされます。詳細については、< ahref

回答:


60

私が持っている$HOMEgitの下。.gitignoreファイルの最初の行は

/*

残りは、!修飾子の使用を無視しないパターンです。この最初の行は、デフォルトではホームディレクトリ内のすべてのファイルを無視することを意味します。バージョン管理したいファイルは次のようになります.gitignore

!/.gitignore
!/.profile
[...]

私が持っているトリッキーなパターンは次のとおりです。

!/.ssh
/.ssh/*
!/.ssh/config

つまり、バージョン管理.ssh/configをしたいだけです。キーや.sshの他のファイルをgitに入れたくないのです。上記は私がそれを達成する方法です。

編集:すべてのパスの先頭にスラッシュを追加しました。これにより、無視パターンはどこでもではなく、リポジトリの最上部($ HOME)から一致します。たとえば!lib/、パターンが(libディレクトリ内のすべてを無視しないでください)で、ファイルを追加した場合.gitignore、以前はパターン(!.gitignore)がそれに一致していました。先頭のスラッシュ(!/.gitignore)を使用すると.gitignore、ホームディレクトリでのみ一致し、サブディレクトリでは一致しません。

これが私の無視リストと実際的な違いをもたらすケースを見たことはありませんが、技術的に正確であるように思われます。


1
同じことがはるかに簡単な方法で達成できるように思えます。
ニックヴォリンキン

24

(同じ目的で)私がすることは、構成ファイルをサブディレクトリに入れ~/lib、ホームディレクトリにシンボリックリンクを置くことです.emacs -> lib/emacs/dot.emacs。バージョン管理下で明示的に記述した構成ファイルのみを保持します。私のホームディレクトリには、バージョン管理下にない自動作成された多数のドットファイルが含まれています。したがって~/lib、バージョン管理下にあり、私のホームディレクトリはそうではありません。

のファイルからシンボリックリンクを作成するスクリプトがあります~/lib。新しいマシンでアカウントを作成するとき、~/libそのスクリプトをチェックアウトして実行することでアカウントを作成します。

私の経験はgitではなくCVSであるため、100%の譲渡はできません。ホームディレクトリをCVSの直下に置かなかった理由の1つは、ホームディレクトリ~/.cvsignoreだけでなく、すべてのCVSチェックアウトに適用されることです。gitにはこの問題はありません。ホームディレクトリをバージョン管理下に置くことと比較した場合のこのアプローチの欠点は、git status明示的に無視することを決定したファイル(無視ファイルにリストされるため表示されない)と、意見のないファイル(で表示されます?)。

一部のファイルは、マシンごとに異なる必要があります。と呼ばれるディレクトリにそれらを置き、それらの~/Local/SITENAME/libシンボリックリンクを作成するか、(それをサポートするファイル形式の場合)の下のファイルにincludeディレクティブを作成します~/lib。シンボリックリンクもあり~/Here -> ~/Local/SITENAMEます。gitは、CVSとは異なり、ほとんど似ているが同一ではないリポジトリをサポートするように設計されているため、マシン固有のファイルを管理するより良い方法があるかもしれません。私のドットファイルのいくつかは、実際にはシンボリックリンクではなく、~/libおよびの下のコンテンツから自動的に生成されます~/Here


おそらくcore.excludesfile =があり~/.gitignoreます。このような構成がないと、ファイルは、保存されているリポジトリ以外のリポジトリには適用されません~/.git(サブリポジトリにも適用されません)。core.excludesfile = を使用~/.git-user-excludesして、すべてのGitリポジトリに適用する除外(場所に関係なく)と、ホームディレクトリ(の一部)を保持するリポジトリに適用する除外の競合を回避します。
クリスジョンセン

@クリス:私はgitについてほとんど知らない。私はgitignoreマニュアルページでこの文を誤解しているかもしれません:「パスと同じディレクトリまたは任意の親ディレクトリにある.gitignoreファイルから読み取られたパターン(…)」実際にチェックアウトのルートで停止します.gitディレクトリ)がありますか?
ジル

1
はい、.gitignoreファイルの上方検索は作業ツリーのルートによって制限されます。あなたが引用した文は続きます:「(作業ツリーのトップレベルまで)」。
クリスジョンセン

@Chris:私のバージョンのmanページにはこれらの言葉がありません。言葉遣いが明確になっているようです。答えを修正しました。ありがとう!
ジル

これがされたチャットで議論最近
strugee

11

Gitの機能を使用して、ファイルがにリストされていても、ファイルの追跡を続けることができます.gitignore。だから、これは十分です.gitignore

$ cat .gitignore
/*

追跡するファイルごとに、実行しますadd -f-fパラメーターは、in .gitignoreとの両方を無視してオーバーライドします.git/info/exclude)。

git add -f .gitignore
git add -f .profile
git add -f .zshrc
git add -f .ssh/config

ファイルのインデックスが作成されると、Gitはファイルが無視されているにもかかわらず、すべての変更を追跡します。同じことがディレクトリに対しても機能しますが、実際に存在するファイルに対してのみです:

git add -f somedirname

そこに現れるすべての新しいファイルでディレクトリ全体を追跡したい場合は、camh.gitignore回答で説明されているように、ある方法で除外することができます。

!/somedirname

ファイルの追跡を停止したい場合、次のコマンドはGitのインデックスからファイルを削除しますが、ハードドライブには手を加えません。

git rm --cached .ssh/config

1
できれば私のポイントをあげます。このメソッドは、ディレクトリではなくファイルの追跡にのみ使用できることに注意してください。ディレクトリ内のすべてのファイルをgitで追跡する場合は、.gitignoreでそのディレクトリの無視を解除する必要があります。そうしないと、そのディレクトリ内の新しいファイルは新しいファイルとして表示されません。
-camh

5

そのために古いものを使用rcsします。

マンページを見ているcicorcs。これらのサイトも役立つはずです:

たとえば、ドットファイルをバージョン管理するためにそれを使用します:

ci -u .*vimrc

そして、それらを編集したい場合:

co -l .*vimrc

にという名前のディレクトリを作成することをお勧めRCSします~。そうすると、そのディレクトリをどこかに簡単にバックアップできます。


2
rcsは今ではかなり古くなっており、gitはrcsが行うすべてのことを行っています。以前は、サーバー上にリポジトリを設定するオーバーヘッドを望まないローカルなものにrcsを使用していましたが、そのような使用法のためにgitに完全に切り替えました。cvs2gitをラップして、rcsファイルを含む既存のディレクトリ階層をgitに変換するスクリプトを作成しました。
ニールメイヒュー

1
はい、私はそれが時代遅れであることを知っています。質問は、それを行う方法に関するヒントでした。私はこの男に、何年も何年もやってきたことを伝えたところです( "日付"、ヒント、ヒント)。それが唯一の合理的な方法であるという意味ではありませんでした。
ポレモン

5

$HOME/.conf/BitBucket Mercurialリポジトリから設定ファイルをチェックアウトします。GitHubリポジトリも同様に機能します。

~/.confチェックアウトはしてシンボリックリンクを設定するために設定ファイルやシェルスクリプトが含まれている$HOME内の各ファイルへ~/.conf。(インクルージョンをサポートするコンフィグ形式については.bashrc.inputrc.vimrc、など)私は、~/.conf私は地元のオーバーライドを行うことができるように、それまでのファイルではなく、リンクを。

一部の設定ファイルについては、Dropboxフォルダー内のファイルにシンボリックリンクし、Dropbox経由で共有します。

数か月間$HOME、バージョン管理を維持しようとしましたが、大量の無視リストを管理するのにうんざりし、実行中のアプリによって行われた構成の変更をチェックインするのにうんざりしていました。~/.gconfまたは~/.config/monitors.xmlで競合を修正したり、異なるバージョンのデスクトップアプリを処理したりすることを想像できますか?

個人的にカスタマイズし、グローバルなデフォルトとしてマシン間で共有したい設定ファイルの限定リストへのシンボリックリンクまたはインクルードが簡単だと思います。


3

次のPython Dotfilesスクリプトの使用を開始しました。これは、ファイルを自動リンクする便利なツールです:https ://pypi.python.org/pypi/dotfiles


1

関係のないフォルダーをソース管理下に置くという2番目の考えは良いことだと思います。

そこに2つのシェルスクリプトを追加するだけです。1つは管理下にあるファイルをコピーし、もう1つはファイル~を収集~してソース管理フォルダーにコピーしてコミットします。


0

新しいマシンをセットアップするために使用する小さなルビースクリプトを次に示します。

#!/usr/bin/env ruby
# setup.rb

#list of dirs which you don't want to symlink
ignored = %w(.gitignore .gitmodules misc setup.rb readme)

current_dir = File.expand_path(Dir.pwd)
home_dir = File.expand_path("~")

links = `git ls-tree --name-only HEAD`.lines.map(&:strip).select {|x| !ignored.include?(x)  }

links.each do |link|
  link = File.join(current_dir, link)
  symlink = File.join(home_dir, File.basename(link))
  `ln -ns #{link} #{symlink}`
end
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.