2012-04-21 46 views
2

在設計另一個Git .dotfiles管理系統時出現此問題。我想使用$HOME作爲我的工作樹,並將其存儲在其他地方(不在.git之下,因爲這會混淆其他存儲庫)。

在老機器與先前複製的和潛在的扭捏點文件,我現在想克隆我的新點文件存儲庫和(波手)獲得一個狀態,我可以看到的(預)現有的狀態,我$HOME/.* dotfiles修改爲我新克隆的存儲庫的主服務器。這主要是背景,在Git我只是想謹慎檢查一個髒目錄而不覆蓋

(在一般情況下,我可以只啓動一個新的目錄,然後在我的變化複製,但似乎很難做到,當工作樹是我$HOME。)

我找到一個對命令這似乎讓我在正確的地方,但我 不知道是否有或者是陷阱,以這種方法還是比較簡單的方法可以做到 同樣的事情:

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

做這兩個命令得到相同的狀態爲複製我的家,做一個普通的結帳,然後複製我的文件,如tha t 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 

回答

0

我想用$ HOME作爲我工作的樹,並在庫存儲在別處 (不屬於git的爲混淆其他存儲庫)。

不這樣做。我要做的就是

把你的工作樹在這裏

/opt/dotfiles 

把你的回購這裏

/opt/dotfiles/.git 

然後,你可以引導工作樹$HOME運行

. /opt/dotfiles/bootstrap.sh 

著名例如,我的例子在這裏

mathiasbynens bootstrap.sh

svnpenn bootstrap.sh

+0

你能否澄清「不這樣做」?我的方法存在固有風險需要謹慎? rsync-repo有什麼優勢?$ HOME?謝謝 – bsb 2012-07-31 04:19:35

+1

'$ HOME'是一個很常用的目錄,不應該是git工作目錄的網站;幾乎某些工作目錄會被污染 – 2012-07-31 04:43:49

0

更新2012年8月19日

我一直在使用這種方案設置我的新的和現有的帳戶點文件的一小會兒,現在和上面的命令避風港」 t迄今爲止銷燬的東西。 另一方面,沒有git專家已經表示批准這種安排 有些人已經不情願地模糊地「你瘋了嗎?「一種方式。

我現在有別名doton/dotoff和調整GIT_DIR和GIT_WORK_TREE,採購文件 所以我讓在工作中的調整,嘗試,推到github上,然後在家中更新我的其他機器。 大多數的時間,它是一個簡單的快進或重訂,但偶爾需要髒 更新。

髒更新

我在這裏加入這個,因爲它是在問題勾勒了該方法的另一半。

說我git加我〜/ .XComp ose並推它。當我想把它拉到已經有.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