2010-11-25 6 views
6

कहें कि मैंने कुछ समय पहले < सुविधा.c > पेश किया था और अब ध्यान दें कि यह मेरी main शाखा का हिस्सा नहीं बल्कि एक शाखा feature का हिस्सा नहीं होना चाहिए था। क्या इसका उपयोग करना संभव है उदा। git-filter-branch शाखा में main शाखा से बाहर सभी < सुविधा.c > का इतिहास स्वचालित रूप से स्थानांतरित करने के लिए git-filter-branch?गिट: कुछ फ़ाइलों का एक अलग शाखा में विभाजित इतिहास

उत्तर

6

ऐसा लगता है जैसे आप कुछ पागल कर रहे हैं! :)

उसने कहा, मुझे कुछ विकल्प दिखाई देते हैं, जिनमें से कोई भी विशेष रूप से स्वचालित नहीं है।

  1. आप उस फ़ाइल को वर्तमान के साथ प्रतिबद्ध के लिए ढेर मिल गया है, तो बस गलती स्वीकार, एक नई शाखा अपने सिर से दूर है, और जब तक वे स्थिर हो आगे कहा कि शाखा में डाल दिया है कि सुविधा के साथ करता है । यदि आप रेपो साझा कर रहे हैं, तो यह एकमात्र वास्तविक विकल्प बन जाता है। कोई भी अलग इतिहास नहीं लेना चाहता, खासकर यदि उस सुविधा को इतिहास में गहराई से किया गया था।

  2. यदि आप केवल 10 या उससे भी कम बात कर रहे हैं जो वास्तव में उस फ़ाइल को छुआ है, और वे हाल ही में कई अन्य प्रतिबद्धताओं के बिना प्रतिबद्ध हैं, तो आप हेड पर एक नई शाखा देख सकते हैं और शाखा को वापस कर सकते हैं आप फीचर को जोड़ने से पहले इस फीचर को वापस नहीं चाहते हैं, और उसके बाद चेरी चुनने की सुविधा आपको फीचर शाखा से बाहर करनी चाहिए जबतक कि आप उन्हें बाद में किसी भी तारीख में प्रतिबद्ध करने के लिए तैयार न हों।

  3. आप इतिहास के एक टन के साथ काम कर रहे हैं, interleaved के बहुत करता है, और तुम सच में उस सुविधा मौजूद है करने के लिए बिल्कुल, आप ऊपर एक छोटे से खोल स्क्रिप्ट है कि उत्पादन लेता लिख ​​सकता है नहीं करना चाहती git log और चेरी इसे एक नई शाखा में चुनता है। की तर्ज पर कुछ:

    $ cd git-repo 
    $ git checkout -b feature-x 
    $ the-perfect-shell-script `git log --pretty=format:"%H" path/to/feature.c` 
    

    एक बार जब आप प्रतिबद्ध चेरी बाहर उठाया के सभी के साथ कि सुविधा शाखा है, तो आप तो git filter-branch उपयोग कर सकते हैं प्रतिबद्ध संदर्भ जो उस फ़ाइल के सभी बाहर फिल्टर करने के लिए। man page का एक साधारण उदाहरण है जो वास्तव में करता है।

    एक बार जब आप इसे प्राप्त कर लेंगे, तो आप git rebase feature-x --onto <filtered-branch> कर सकते हैं और आपको जाने के लिए अच्छा होना चाहिए।

    बेशक इसे काफी हतोत्साहित किया जाना चाहिए, खासकर अगर प्रकाशित किया गया है तो प्रकाशित किया गया है।

+1

सौभाग्य से कुछ भी प्रकाशित नहीं हुआ है, फीचर-ब्रांचिंग का मेरा विचार "_before_ publishing" पर विचार करना है -फेज :) इसलिए मैं कोशिश करूंगा 3. –

+0

+1 ' खोल-स्क्रिप्ट 'गिट लॉग --pretty = प्रारूप: "% एच" पथ/से/feature.c''। मेरे विचार के लिए [मेरा खुद का जवाब] देखें (http://stackoverflow.com/questions/4278264/git-split-history-of-some-files-into-a-separate-branch/4283970#4283970) इसके बारे में मेरे विचार के लिए –

+0

'गिट लॉग ...' में से कोई भी 'गिट रेव-लिस्ट मास्टर - फीचर.c' का उपयोग कर सकता है –

2

ठीक है, यहाँ मेरी जाने है:

था मैं <feature.c> नहीं जोड़ तोड़ करता है, मैं <feature.c> के पहले प्रतिबद्ध और उसके बाद में git log साथ git cherry-pick इस्तेमाल किया से की शाखाओं किया जा सकता था एक लूप, suggestedTim Visher द्वारा। मास्टर से शुरू मुझे लगता है कि यह काम करना चाहिए:

#!/bin/bash 
# create the feature branch starting from feature.c's first commit 
FIRSTCOMMIT=$(git log --pretty=format:"%H" feature.c | tail -n1) 
git checkout -b feature $FIRSTCOMMIT 

# find all commits concerning feature.c... 
for i in $(git log feature..master --reverse --pretty=format:"%H" feature.c) 
do 
    # ... cherry-pick them ... 
    git cherry-pick $i 
    # ... and copy ONE modified tag of it if existing 
    git describe --tags --exact-match $i && xargs taghelperscript 
done 
# now eliminate feature.c from master 
git filter-branch --prune-empty --tag-name-filter "cat" --index-filter 'git rm --cached --ignore-unmatch feature.c' $FIRSTCOMMIT..master 

taghelperscript के साथ किया जा रहा git tag prefix.$1 की तरह कुछ (शायद यह बेहतर किया जा सकता है?)। टैगिंग भाग शायद मेरे द्वारा उपयोग किए जाने वाले हल्के टैग के लिए ही काम करता है। यह भी सलाह दीजिये कि < सुविधा के साथ यह काम नहीं करता है।सी > का नाम किसी बिंदु पर बदल दिया गया है, और यदि यह प्रारंभिक प्रतिबद्धता में पहले से मौजूद है तो यह दो अलग-अलग इतिहास, या (मेरा अनुमान) master में एक प्रतिबद्धता का कारण बन सकता है जिसमें < सुविधा.c > का विलोपन शामिल है बाद में एक विलय संघर्ष या भ्रम।


मुसीबत है, मेरे प्रतिबद्ध में से कुछ इस प्रकार git cherry-pick एक अनसुलझे मर्ज को गति प्रदान करने के कारण अन्य फ़ाइलों को संशोधित, या इन अन्य फ़ाइलों परिचय देता है। तो इसके बजाय, मैं कुछ git filter-branch जादू का प्रयास करूंगा। बाद में । रहो रहें ...

संबंधित मुद्दे