2011-04-01 249 views
2

我正在使用git,但我很樂意聽到與其他SCM相關的答案。維護一組不會被提交給SCM的小修改

我有一些小的變化,這只是對我有關(使用不同的構建方案,相關的只有我的配置),我真的很需要他們。

正確的做法是將它合併到主幹中,但是直到我將它合併到主幹中我必須保留一個不會被提交的更改列表。

所以我們假設我需要將我的makefile改成CC=mygcc(因爲我需要指向我正在編譯的其他軟件的壞版本的gcc符號鏈接),但我不想提交它(其他不要,所以其他人不希望有符號鏈接mygcc)。

我該怎麼做才能輕鬆同步並更新主存儲庫?

回答

3

在水銀,這是最好用一個mq patch完成。

爲了使初始補丁:

cd <working copy> 
hg qinit 
...make changes to your working copy 
hg qnew <patch_name> 

然後,當是時候拉從遠程更改或實際提交新的局部變化:

hg qpop -a  # remove all patches from your working copy 
hg pull --update # get new changesets from the remote and update to the latest 
...work on local files 
hg commit -m "commit changes without touching the patch" 
hg push   # send changes to a remote repo that don't include the patch 
hg qpush -a  # apply all patches to your updated working copy 
+0

是的,這是超級容易與mercurial補丁隊列! – krupan 2011-04-01 16:01:34

+0

等待,請在修補程序打開時顯示如何提交新修訂,並避免提交不需要的修補程序。 – 2011-04-03 10:23:20

+0

@Elazar:我更新了我的答案,以顯示如何在不提交「不需要」的補丁的情況下落實更改。 – 2011-04-06 13:32:43

2

git我看到2個選項:

  1. 圍繞着這一變化,但從來沒有把它添加到索引。這是確定的,但如果你的變化跨越多個文件,如果您需要提交只有一些更改某個文件就變得無聊(git add -p,等待,我是否需要該行...)。
  2. 始終在遠程主機之前執行1次提交。將更改提交給主服務器,並在提交所有內容之前提交,以便您不想推送的提交將處於頂層。然後將所有內容都推送到服務器,除了最後一次提交。

讓我展示一個我寫的快速腳本,以確保您的臨時提交一直持續。我假定臨時提交將在提交消息中有#alwaysontop

這個腳本基本搜索第一個到達與#alwaysontop提交信息的提交和重訂後,這一切的變化,使這將是在上面。確保你的提交和#alwaysontop之間沒有衝突,否則它將無法正常工作。

你應該確保你永遠不會推提交標有#alwaysontop與推前鉤。

#!/bin/sh 
if ! git diff-index --quiet HEAD --; then 
     echo "Repository is dirty, only run with clean index and working tree" 
     exit -1 
fi 

KEYWORD=':/#alwaysontop' 

if ! git rev-parse $KEYWORD &>/dev/null; then 
     echo No commit with $KEYWORD found 
     exit -1 
fi 

TEMPREV=`git rev-parse $KEYWORD` 
REMOTE_BRANCH=`git rev-parse $TEMPREV^` 

echo @ rebasing current commit before $TEMPREV 
git rebase --onto $REMOTE_BRANCH $TEMPREV && \ 
NEWHEAD=`git rev-parse HEAD` && \ 
echo @ now at $NEWHEAD moving to always-on-top commit && \ 
git reset --hard $TEMPREV && \ 
echo @ rebasing $TEMPREV to be topmost && \ 
git rebase $NEWHEAD 
4

這實在是對Elazar Leibovich's second option評論這對於評論來說已經變得非常有用了:)在提交圖形術語中,我基本上和選項2一樣,但是維護一個本地分支,它有我的變化而不是留在主分區上。換句話說,通常情況是這樣的:

A --- B --- C (master,origin/master) --- D --- E (local) 

...如果我想從主更新,我會做:

git checkout local 
git fetch origin 
git rebase origin/master 

...去:

A --- B --- C (master) --- F --- G (origin/master) --- D' --- E' (local) 

如果我加入了更多的提交到local,我會做一個git rebase -i origin/master這樣我就可以確保我的DE仍然是歷史上最近的。

的這種過度埃拉扎爾Leibovich的選項2的好處就是,它減少了你要與git pushgit push master小心把你的本地更改master的風險,因爲你的本地修改絕不會在master分支應該沒有分支稱爲local遠程。 (如果有,選擇一個不同的名稱,顯然:))

當你必須要推回master東西,例如提交HI這裏:

A -- B -- C (master) -- F -- G (origin/master) -- H -- I -- D'' -- E' (local) 

...你會這樣做:

git checkout master 
git merge I 
git push origin master 
+1

這裏棘手的事情是,無論你在哪個分支上,你都經常需要這些改變,所以當你開始越來越積極的開發時,你最終想要在你去的任何地方重新分配這個分支的副本......它可以開始變得有點笨重,並且很容易錯過某些東西。儘管如此,這仍然是你能做的最好的事情,盡我所能。 (除了'update-index --assume-unchanged',對我來說總是顯得有些狡猾。) – Cascabel 2011-04-01 14:16:23

+0

我明白你的觀點,但我認爲當我在多個分支需要這樣的改變時,我會把它當作請注意將代碼引入主設備以便可以通過本地配置設置效果... – 2011-04-01 15:51:09

+0

一般來說,這已經足夠了。有時候,我們最終做的不是完全配置的東西,或者那些非常重要的事情,使得它們可配置將是非常多的工作(或不一定是真正的維護者想要的東西)。不幸的是,這個世界並不總是完美的。 – Cascabel 2011-04-01 16:16:53