2013-02-14 17 views
6

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

लेकिन ...

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

git st # check if there's something I haven't committed 

git stash list # check if I've stashed something 

git log --oneline --decorate --all # check if all branches have been pushed 

मैं इसे सरल बनाना चाहता हूं। विशेष रूप से आखिरी कदम, जिसके लिए मुझे अपनी सभी शाखाओं को देखने की आवश्यकता होती है और देखें कि स्थानीय और रिमोट वाले सिंक में हैं या नहीं। वास्तव में सुनिश्चित करने के लिए, मुझे यह सुनिश्चित करने के लिए थोड़ा सा स्क्रॉल करना पड़ सकता है कि मुझे कुछ भी याद नहीं है।

मैं इसे स्वचालित रूप से करने के लिए एक स्क्रिप्ट लिखने पर विचार कर रहा हूं, लेकिन हो सकता है कि पहले से ही कोई समाधान हो? (मुझे लगता है कि मुझे यह ज़ोर देना नहीं है कि मैं इसे कमांड लाइन पर करना चाहता हूं और किसी भी फैंसी जीयूआई का उपयोग नहीं करना चाहता हूं: डी)

आप लोग इस बात से कैसे संपर्क करते हैं? यह जांचने के लिए आपकी प्रक्रिया क्या है कि आप कुछ भी नहीं भूल रहे हैं? आप किन उपकरणों का उपयोग करते हैं? सभी विचारों का स्वागत है!

उत्तर

5

यह जानने के लिए कि कोई स्थानीय और रिमोट शाखा सिंक हो रही है, आपको हेड संशोधन के हैंश की तुलना करने की आवश्यकता है।

जब आप git branch -v -a निष्पादित आप इसी प्रमुख संशोधन के हैश के साथ-साथ स्थानीय और दूरस्थ शाखाओं की एक सूची प्राप्त होगा:

$ git branch -v -a 
    develop        44e61b5 <Commit message> 
    feature/CodeContracts    c26edee <Commit message> 
* feature/Foo       3a40e22 <Commit message> 
    master        e68e28a <Commit message> 
    remotes/origin/HEAD     -> origin/master 
    remotes/origin/develop    44e61b5 <Commit message> 
    remotes/origin/feature/Bar   be9666c <Commit message> 
    remotes/origin/master    e68e28a <Commit message> 

आप आसानी से देख सकते हैं, को विकसित करने और मास्टर अप-टू-डेट कर रहे हैं स्थानीय और दूरस्थ, feature/Bar स्थानीय रूप से मौजूद नहीं है और feature/CodeContracts और feature/Foo दूरस्थ रूप से मौजूद नहीं है, इसलिए उन्हें स्थानीय भंडार हटाने से पहले धक्का दिया जाना चाहिए।

+0

यहां तक ​​कि बेहतर: "गिट शाखा -vva" (नोट डबल-वी) का उपयोग करें। यह अपस्ट्रीम शाखा को भी प्रिंट करेगा जहां एक सेट किया गया है, अगर कुछ धक्का नहीं दिया गया है तो यह स्पष्ट कर देगा। इस तरह, एसएचए 1 की तुलना केवल अपस्ट्रीम शाखा के बिना स्थानीय शाखाओं के लिए आवश्यक होगी। – sleske

+0

@sleske: मैंने पाया कि भ्रामक होना है। यह 'फू' फीचर शाखा के लिए एक गैर-दूरस्थ रिमोट शाखा प्रिंट करता है। –

+0

डाउनवॉटर एक टिप्पणी छोड़ सकता है तो यह अच्छा होगा। अन्यथा मैं जवाब ठीक नहीं कर सकता। –

1

बार-बार आपके रिपोज़ को हटाना एक खराब बात है। उदाहरण के लिए Linux रेपो 126 एमबी है; आप देख सकते हैं कि यह कैसे जल्दी हो सकता है। शायद this script मदद करेगा। यह निर्देशिका में सभी फ़ोल्डरों की जांच करता है (इस मामले में /opt) और आपको प्रत्येक के git status देता है।

#!/bin/sh 
warn() 
{ 
    printf '\e[1;35m%s\e[m\n' "$*" 
} 
c() 
{ 
    printf '\ec' 
} 
compgen -d /opt/ | while read k 
do 
    c 
    cd $k 
    git status 
    warn $k 
    read </dev/tty 
done 
+1

मुझे स्थानीय रिपोज़ को खराब करने के बारे में एक और विस्तृत उत्तर सुनना अच्छा लगेगा। मैं किसी से यह कहने की उम्मीद कर रहा था, इसलिए अब मैं सोच रहा हूं कि क्यों :) लिनक्स रेपो एक बहुत बुरा उदाहरण है, मेरा अधिकांश कोड पुस्तकालयों में विभाजित है और इस प्रकार छोटे से छोटे होते हैं। मैंने जिथब पर लगभग 50 सार्वजनिक रिपोज़ रखे हैं और शायद दो दर्जन निजी भी हैं। उनमें से ज्यादातर हाल ही में नहीं बदला गया है, इसलिए व्यक्तिगत रूप से मुझे उन सभी को मेरी डिस्क पर हर समय रखने में कोई रूचि नहीं है। लेकिन मैं समझने के लिए सभी कान हूं कि यह अभ्यास बुरा क्यों है। – Jakob

3

डैनियल Hilgarth के जवाब पर बिल्डिंग, मैं निम्नलिखित चरणों का

पहले, git fetch --all चलाने सुनिश्चित करें कि आप सभी नदी के ऊपर खजाने से नवीनतम परिवर्तन है बनाने के लिए

फिर चलाने की सलाह देते हैं git branch -vva - (ध्यान दें डबल-वी)। यह सभी शाखाओं (a) प्रिंट करेगा, और प्रत्येक शाखा के लिए नवीनतम प्रतिबद्धता, और अपस्ट्रीम शाखा (यदि एक अपस्ट्रीम सेट है) पर जानकारी।

परिणाम इस तरह दिखेगा:

br1     88006cd Branch 
    br2     0b68b6f [origin/br2] New commit 
    c      9ed6569 Dummy 
* master    f4664d4 [origin/master: ahead 1] my commit 
    remotes/origin/HEAD -> origin/master 
    remotes/origin/br3 9ed6569 Dummy 
    remotes/origin/master 9ed6569 Dummy 

आप चार स्थानीय शाखाएं हैं देख सकते हैं (मास्टर, ग, br1, br2)। मास्टर और बीआर 2 अपस्ट्रीम शाखाएं हैं। br2 पूरी तरह से धक्का दिया जाता है, मास्टर के पास एक स्थानीय प्रतिबद्धता है जिसे अभी तक धक्का नहीं दिया जाता है ("आगे 1")।

br1 और सी अपस्ट्रीम जानकारी के बिना स्थानीय शाखाएं हैं। इनके लिए आपको जांच करनी चाहिए कि क्या करना है - वे पूरी तरह से विलय हो सकते हैं, और अनावश्यक; या आप उन्हें अपस्ट्रीम धक्का देना चाहते हैं; या आप उन्हें स्थानीय रूप से मर्ज करना चाहते हैं, उदा। मास्टर करने के लिए, और फिर उसे धक्का। उन शाखाओं को देखने के लिए जो आपके स्थानीय मास्टर में पूरी तरह से विलय नहीं हुए हैं, git branch --no-merged master का उपयोग करें। इस उदाहरण में, यह "br1 br2" प्रिंट करेगा (क्योंकि शाखा सी मास्टर का पूर्वज है)।

अंत में, आप देख सकते हैं कि br2 के लिए अपस्ट्रीम शाखा मूल/br2 सूचीबद्ध है, जो मौजूद नहीं है। इसका मतलब है कि रिमोट रिपोजिटरी ने इस शाखा को हटा दिया है (और आपने "गिट रिमोट प्रून" या "गिट fetch -p" का उपयोग करके इस विलोपन को प्राप्त किया है)। दोबारा, आपको यह तय करना होगा कि क्या आप अपने स्थानीय कामों को त्यागना चाहते हैं, या फिर से धक्का देना चाहते हैं या उन्हें मर्ज करना चाहते हैं।

+0

+1: "आगे 1" अच्छा है। –

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