3

この問題は、別の Git.dotfiles管理システムを計画しているときに発生しました。$HOME私は自分の作業ツリーとして使用し、リポジトリを別の場所に保存したいと考えています(.git他のリポジトリを混乱させるため、下ではありません)。

以前にコピーされ、微調整された可能性のある dotfiles を持つ古いマシンで、新しい dotfiles リポジトリのクローンを作成し、($HOME/.*を振る)マスターへの変更としてドットファイルの (以前の) 既存の状態を確認できる状態にします。私の新しくクローンされたリポジトリの。これは主にバックグラウンドです。Git では、上書きせずにダーティ ディレクトリで慎重にチェックアウトしたいだけです

(通常、新しいディレクトリから始めて変更をコピーすることもできますが、作業ツリーが my の場合は難しいようです$HOME。)

適切な場所に移動できるように思われるコマンドのペアを 1 つ見つけましたが、このアプローチに落とし穴があるのか​​ 、同じことを行うためのより簡単な方法があるのか​​ はわかりません。

git read-tree -v HEAD # load HEAD into the index
git checkout-index -a # cautiously check out all files without overwriting

これらの 2 つのコマンドは、私の家をコピーして通常のチェックアウトを行い、ファイルをコピーして戻すのと同じ状態にgit diffなるのでしょうか? このマシンで行った変更だけで、ファイルは削除されませんか?

これらに適用すべき他のオプションはありますか?

コンテキストは私の(アルファ)ブートストラップ スクリプトです。

git clone --bare -n git://github.com/$(git config github.user)/.dotfiles.git ~/.dotfiles/repo.git
git config -f .dotfiles/repo.git/config core.bare false
git config -f .dotfiles/repo.git/config core.logallrefupdates true
git config -f .dotfiles/repo.git/config core.worktree $HOME
export GIT_DIR=~/.dotfiles/repo.git ;  export GIT_WORK_TREE=~
git read-tree -v HEAD 
git checkout-index -a # all files without overwriting
ln -sf $HOME/.dotfiles/gitignore-dots $HOME/.dotfiles/repo.git/info/exclude
4

2 に答える 2

0

2012-08-19 更新

私はこのスキームを使用して、新しいアカウントと既存のアカウントにドットファイルをセットアップしてきましたが、上記のコマンドはこれまでのところ何も破壊していません。一方、git の専門家はこの取り決めを承認していません。一種の方法。

私は現在、GIT_DIR と GIT_WORK_TREE を調整するエイリアス doton/dotoff とソース ファイルを持っているので、職場で微調整を行い、それを試し、github にプッシュしてから、自宅の他のマシンを更新します。ほとんどの場合、簡単な早送りまたはリベースですが、場合によってはダーティ アップデートが必要になります。

ダーティアップデート

質問でスケッチされたアプローチの残りの半分であるため、ここに追加します。

~/.XCompose を git add してプッシュするとします。既に .XCompose ファイルがあるマシンにこれをプルしたい場合は、変更をフェッチし、ローカル (追加されていない) コピーとの差分を確認して、そこからマージします。Git はこれをチェックして救済しますが、これは通常は適切です。

繰り返しますが、配管コマンドを使用して高レベルのコマンドのほとんどを実行していますが、ダーティな作業コピーを操作するための面倒な安全チェックはありません。配管コマンドはドキュメントで十分にカバーされていませんが、動作するようです (保証はありません)。

これらの手順は、新しいローカル変更がないことを前提としています。リベースは行いません。

(これにより、追跡されていないファイルを含むファイルが破棄される可能性があることに注意してください。これが安全に近いかどうかはわかりません。何か問題が発生した場合、かなりの混乱が残る可能性があると思います。)

git fetch # download FETCH_HEAD

# Check HEAD is an ancestor of FETCH_HEAD
cmp <( git rev-parse HEAD ) <( git merge-base HEAD FETCH_HEAD ) \
    || echo "merge-base is not HEAD, not fast forward"

# merge FETCH_HEAD into HEAD in index (2 tree merge is ff, no local changes)
# (no -u means the work tree is not updated)
git read-tree -v -m  HEAD FETCH_HEAD # --trivial ?
# index now merged with FETCH_HEAD

# set HEAD to be FETCH_HEAD with dereferencing
git update-ref HEAD FETCH_HEAD

# update work tree without overwriting existing files (not forced)
# (existing un-added isn't overwritten)
git checkout-index -a

# can now check diffs for conflicts add either commit/edit/checkout
git diff --stat

git pull -vn # should be a no-op

状態を確認するために使用するコマンドを次に示します。

git rev-parse HEAD FETCH_HEAD   # what do they point to
git diff --stat HEAD FETCH_HEAD # differences
git merge-base HEAD FETCH_HEAD  # common ancestor
for r in HEAD FETCH_HEAD; do echo $r ; git log --oneline $r | head -1; done
git name-rev $( git merge-base HEAD FETCH_HEAD )

# peek at index
git ls-files --directory --exclude-standard --stage

git diff-index --cached FETCH_HEAD # see "local changes" carried forward
于 2012-08-19T02:41:16.033 に答える
0

$HOME を作業ツリーとして使用し、リポジトリを別の場所に保存したいと考えています (他のリポジトリを混乱させるため、.git の下ではありません)。

これをしないでください。私がすることは

ここに作業ツリーを置きます

/opt/dotfiles

ここにレポを置きます

/opt/dotfiles/.git

次に$HOME、実行して作業ツリーをブートストラップできます

. /opt/dotfiles/bootstrap.sh

有名な例、そして私の例はこちら

mathiasbynensのbootstrap.sh

svnpenn ブートストラップ.sh

于 2012-07-30T22:14:44.940 に答える