2010-04-21 10 views
9

मैं एक गिट भंडार के एक डार्क्स दर्पण स्थापित करने की कोशिश कर रहा हूँ। मेरे पास कुछ ऐसा है जो ठीक काम करता है, लेकिन एक महत्वपूर्ण समस्या है: यदि मैं गिट रेपो में काम करने का पूरा समूह दबाता हूं, तो वे एक ही डार्क्स पैचसेट में विलय हो जाते हैं। मैं वास्तव में यह सुनिश्चित करना चाहता हूं कि प्रत्येक गिट प्रतिबद्ध एक एकल डार्क्स पैचसेट के रूप में स्थापित हो जाए। मैं शर्त लगाता हूं कि किसी प्रकार का git fetch कर रिमोट शाखा की स्थानीय प्रति पूछताछ के बाद संभव है, लेकिन मेरा गिट फू नौकरी पर नहीं है।दूरस्थ गिट भंडार से एक समय में एक प्रतिबद्धता को कैसे खींचें?

यहाँ मैं अब उपयोग कर रहा हूँ (ksh) कोड है, और अधिक या कम:

git pull -v # pulls all the commits from remote --- bad! 

# gets information about only the last commit pulled -- bad! 
author="$(git log HEAD^..HEAD --pretty=format:"%an <%ae>")" 
logfile=$(mktemp) 
git log HEAD^..HEAD --pretty=format:"%s%n%b%n" > $logfile 

# add all new files to darcs and record a patchset. this part is OK 
darcs add -q --umask=0002 -r . 
darcs record -a -A "$author" --logfile="$logfile" 
darcs push -a 
rm -f $logfile 

मेरा विचार

  1. है git fetch प्रयास करें दूरस्थ शाखा के स्थानीय प्रतिलिपि प्राप्त करने के लिए (यकीन है कि वास्तव में नहीं क्या तर्क की आवश्यकता है)
  2. किसी भी तरह से स्थानीय प्रतिलिपि को अंतिम मिररिंग ऑपरेशन के बाद से प्रत्येक प्रतिबद्धता के लिए हैश प्राप्त करने के लिए पूछताछ करें (मुझे नहीं पता कि यह कैसे करना है)
  3. सभी हैश, खींच सिर्फ इतना है कि प्रतिबद्ध और संबद्ध पेचसेट रिकॉर्डिंग के माध्यम से लूप (मैं यकीन है कि मैं जानता हूँ कि यह कैसे करना है अगर मैं हैश पर मेरे हाथ पाने हूँ)

मैं या तो मदद Fleshing का स्वागत करता हूँ से ऊपर के परिदृश्य को बाहर या के बारे में सुझाव कुछ और मुझे कोशिश करनी चाहिए।

विचार?

+0

बस एक अनुस्मारक के रूप में, नीचे कुछ नए उत्तर दिए गए हैं जिन पर आपने टिप्पणी नहीं की है। (जाहिर है उनमें से एक मुझे लगता है कि वास्तव में आपके प्रश्न का विशेष रूप से अच्छा जवाब है;)) –

उत्तर

0

git remote update # fetch all remotes I like it better than just fetch

git log origin/master # can be any remote/branch

git cherry-pick origin/master # example remote/branch you can also specify a sha1

चेरी ले डिफ़ॉल्ट रूप से शीर्ष पैच का चुनाव करेगा।

तीसरे भाग के लिए मुझे लगता है कि आपको यह करने के लिए एक स्क्रिप्ट लिखनी होगी। लॉग के लिए हैश और बहुत सारे विकल्प प्राप्त करने के अन्य तरीके हैं। असल में चेरी-पिक के लिए एक हुक हो सकता है या शायद डार्क्स कोड चलाने के लिए प्रतिबद्ध हो सकता है ... गिट हुक देखें।

वास्तव में उस नोट पर प्रत्येक पैच को रीबेज में लागू किया जा सकता है, तो वह एक गिट प्रतिबद्ध हुक कह सकता है ताकि आप उसे लिख सकें और फिर एक गिट पुल - रीबेस करें और प्रत्येक कोड पर उस कोड को खींचा जाए ...

+0

+1 githooks उद्धृत करने के लिए। – jweyrich

+1

मैंने 'गिट चेरी-पिक' के लिए वेब पर जानकारी का अध्ययन किया है, और यह वही नहीं है जो मैं चाहता हूं! यह एक नया, विशिष्ट प्रतिबद्ध बनाता है! मैं गहरी खुदाई करूंगा। –

0

उपयोग इस एक शाखा से हैश पुनः प्राप्त करने के:

git log --pretty=format:"%h" HEAD..origin/master 

फिर git cherry-pick -n <hash> का उपयोग हर एक को लागू करने के।

@xenoterracide द्वारा उद्धृत एक और विकल्प, githooks का उपयोग कर रहा है।

+4

मैंने 'गिट चेरी-पिक' के लिए वेब पर जानकारी का अध्ययन किया है, और यह वही नहीं है जो मैं चाहता हूं! यह एक नया, विशिष्ट प्रतिबद्ध बनाता है! मैं गहरी खुदाई करूंगा। –

2

क्या आपने Tailor जैसे संस्करण नियंत्रण प्रणाली के बीच परिवर्तनों को स्थानांतरित करने के लिए कुछ मौजूदा समाधानों को देखने का प्रयास किया है, जिसमें कहा गया है कि इसमें गिट और डार्क्स के लिए समर्थन शामिल है? (उस पेज पर समान सिस्टम के लिए सुझाव के रूप में अच्छी तरह से कर रहे हैं।)

अन्यथा, आप आपके द्वारा सुझाए गए दृष्टिकोण का उपयोग करना चाहते हैं, आप प्रत्येक पर git checkout इस्तेमाल कर सकते हैं चेकआउट कि "अलग हेड" में प्रतिबद्ध करने के लिए origin/master को HEAD के बाद प्रतिबद्ध मोड ।उदाहरण के लिए, उदाहरण आप दे बदलना चाहते हैं (और बॉर्न शैल में, मुझे डर लग रहा है, क्योंकि मैं ksh का उपयोग नहीं करते):

# Update all remote-tracking branches from origin 
git fetch origin 

for c in `git log --pretty=format:"%h" HEAD..origin/master` 
do 
    git checkout $c 
    author=$(git log -1 --pretty=format:"%an <%ae>") 
    logfile=$(mktemp) 
    git log -1 --pretty=format:"%s%n%n%b%n" > $logfile 

    darcs add -q --umask=0002 -r . 
    darcs record -a -A "$author" --logfile="$logfile" 
    darcs push -a 
    rm -f $logfile   
done 

# Now go back to master, and merge to keep your master branch up to date: 
git checkout master 
git merge origin/master 

ध्यान दें कि यह Git से इतिहास linearize जाएगा, जो नहीं होता जो मैं चाहता था, व्यक्तिगत रूप से। :) मुझे लगता है कि इसके लिए मौजूदा उपकरण का उपयोग करना सबसे अच्छा है, लेकिन उपरोक्त दृष्टिकोण को काम करने के लिए बनाया जा सकता है।

1

आप कुछ इस तरह कर सकता है:

#!/bin/bash 
git fetch 
count=$(git log --pretty=oneline | wc -l) 
git merge origin/master 
git reset --hard HEAD~$((count-1)) 

मैं इस स्क्रिप्ट के लिए भंडार बनाया है और इसे बाहर की कोशिश की।

enter image description here

enter image description here

अब मैं एक स्थानीय (नाम कल्ले) के साथ एक दूरदराज के भंडार तो मैं Git लाने का नाटक किया और दूरदराज के शाखा नहीं था, लेकिन निम्न पहले और बाद में मर्ज है तुम्हें नया तरीका मिल गया है। बस पूर्ण विलय करें और उसके बाद हेड पॉइंटर का बैक अप लें जब तक कि आप मूल/मास्टर से पहले प्रतिबद्धता तक नहीं पहुंच जाते।

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