2009-05-07 13 views
26

मैं विभिन्न परियोजनाओं के लिए दोनों Mercurial और गिट दोनों का उपयोग कर रहा हूँ और दोनों की तरह। मुझे Mercurial के बारे में थोड़ा परेशान लगता है कि "एचजी स्थिति" वर्तमान निर्देशिका (गिट के विपरीत) के लिए, भंडार रूट के सापेक्ष पथ दिखाता है। क्या इस व्यवहार को किसी तरह से tweaked किया जा सकता है? ,Mercurial "एचजी स्थिति" और सापेक्ष पथ

hg status $(hg root) 

मर्क्युरियल के पुराने संस्करणों के लिए, 1.7 करने से पहले आप इस हैक इस्तेमाल कर सकते हैं, अपने भंडार के ".hg/hgrc" फाइल को जोड़ने:

+0

मुझे लगता है कि .hgrc में एक विकल्प जोड़ा जाना चाहिए, सुविधा अनुरोध के लिए http://bz.selenic.com/show_bug.cgi?id=3835 देखें। –

उत्तर

28

सामान्य तरीके को चलाने के लिए है

[alias] 
sst = status /path/to/root 

इसके लिए उपनाम एक्सटेंशन सक्षम होना आवश्यक है, इसलिए आपको अपनी ~/.hgrc फ़ाइल में "alias =" जोड़ना पड़ सकता है।

Mercurial 1.7 से शुरू, उपनाम विस्तार "!" के बारे में सीखा खोल आदेशों का उपयोग करने से बचने के है, तो आप अब एक वैश्विक उर्फ ​​कि यह करता है हो सकता है:,

[alias] 
sst = !hg status $($HG root) $HG_ARGS 

st = !hg status $(hg root) का उपयोग न करें, क्योंकि है कि एक अनंत लूप बनाता है, अधिक से अधिक एचजी स्थिति चल रहा है।

[alias] 
__mystatus = status 
st = !hg __mystatus $($HG root) $HG_ARGS 
+1

धन्यवाद! यह दुखद है कि उर्फ ​​ext। फिलहाल शैल कमांड की अनुमति नहीं देता है, इसलिए मैं इसके बजाय "hg status $ (hg root)" bash alias बनाने जा रहा हूं। – pachanga

+0

आपका अंतिम उपनाम उदाहरण स्थिति (जैसे --quiet) के किसी भी विकल्प पर नहीं होगा। अंतिम पंक्ति 'सेंट =! एचजी __mystatus $ ($ एचजी रूट) $ HG_ARGS' – krupan

+0

@ कुरान धन्यवाद होना चाहिए! मैंने उस टिप के साथ जवाब अपडेट किया है। मैं शायद ही कभी स्थिति के लिए तर्क का उपयोग करता हूं इसलिए मैंने समस्या को नहीं मारा था। – richq

35

देखने के लिए कार्यक्षेत्र स्थिति रिश्तेदार: - यह उर्फ ​​पार्स में एक बग की तरह लग रहा है, तो आप hg status अन्य नाम पर जड़ से पथ दिखाना चाहते हैं, उसके बाद निम्न मंत्र वैश्विक $ HOME/.hgrc में काम करता है वर्तमान निर्देशिका में आप हमेशा "।" का उपयोग कर सकते हैं। की "एचजी स्थिति" तर्क के रूप में (एक भी बिंदु), अर्थात्:

% hg root     # root of the workspace 
/work/foo 

% pwd      # current directory is <root>/src 
/work/foo/src 

% hg status     # no argument, see all files 
M etc/foo.conf    # all files are shown with paths 
M src/foosetup.c   # relative to workspace root 
% 

अंतर जब आप स्पष्ट रूप से वर्तमान कार्यशील निर्देशिका के लिए चाहते हैं कि रिश्तेदार फ़ाइल नाम रास्तों का उपयोग है कि उनकी प्रारंभिक बिंदु के रूप:

% hg status .    # see only files under current path 
M foosetup.c 
% 
+0

के मेरे संस्करण पर काम करता है" स्वीकृत "की तुलना में बहुत बेहतर और क्लीनर समाधान। – vadipp

+6

दुर्भाग्यवश, स्वीकार किए गए समाधान की तुलना में बिल्कुल वही, अधिक सीमित नहीं है। इसलिए सार्वभौमिक रूप से बेहतर और क्लीनर नहीं। "एचजी स्थिति।" रिश्तेदार पथों का उपयोग करके, नीचे subtree के लिए केवल स्थिति की रिपोर्ट। "एचजी स्टेटस $ (एचजी रूट)" सीडब्ल्यूडी के सापेक्ष पथों का उपयोग करते हुए, संपूर्ण रेपो के लिए रिपोर्ट की स्थिति। क्योंकि इसे एक टिप्पणी में दिखाना मुश्किल है, मैं उदाहरणों के साथ एक नया जवाब जोड़ रहा हूं। –

2

एचजी समय के साथ बेहतर हो रहा है: एचजी 2.2.3 के साथ, मैं st उपनाम परिभाषित कर सकता हूं।

[alias] 
st = !hg status $($HG root) $HG_ARGS 
नतीजतन

:

  • hg st आप वर्तमान निर्देशिका के लिए पथ रिश्तेदार दे देंगे
  • hg status आप एचजी रूट निर्देशिका में पथ रिश्तेदार
2

मैं इस सवाल का जवाब द्वारा जोड़ा जा रहा है, क्योंकि न दे देंगे यह स्वीकार्य उत्तर से बेहतर है, लेकिन क्योंकि यह "एचजी स्थिति" के बीच भेद को स्पष्ट करता है। और "एचजी स्थिति $ (एचजी रूट)"। जो कुछ टिप्पणीकर्ताओं को भ्रमित कर सकता है - बदतर, जो आवश्यक सामानों की जांच करना भूल सकता है।

"एचजी स्थिति।" रिश्तेदार पथों का उपयोग करके, नीचे subtree के लिए केवल स्थिति की रिपोर्ट।

"एचजी स्थिति $ (एचजी रूट)" सीडब्ल्यूडी के सापेक्ष पथों का उपयोग करके पूरे रेपो के लिए रिपोर्ट की स्थिति।

दोनों उपयोगी हैं।

(सामान्यतः, "एचजी स्थिति पथ" पथ ​​के नीचे उपट्री के लिए स्थिति दिखाता है (पूरे रेपो यदि पथ = $ (एचजी रूट) ", लेकिन सीडब्ल्यूडी के सापेक्ष।(मुझे यह स्वीकार करना होगा कि मुझे यह भ्रमित लगता है, क्योंकि दो चीजें हो रही हैं: स्थिति प्राप्त करने के लिए subtree, और cwd से संबंधित पथ दिखाने के लिए।)

यह नीचे एम्बेड किए गए शेल सत्र के उदाहरण द्वारा दिखाया गया है।

$ bash [~/hack] 562 $> mcd hg-test 
./hg-test 
$ bash [~/hack/hg-test] 563 $> hg init . 
$ bash [~/hack/hg-test] 564 $> mkdir subdir 
$ bash [~/hack/hg-test] 565 $> touch foo 
$ bash [~/hack/hg-test] 566 $> touch subdir/bar 
$ bash [~/hack/hg-test] 567 $> hg status 
? foo 
? subdir/bar 
$ bash [~/hack/hg-test] 552 $> hg status $(hg root) 
? foo 
? subdir/bar 
$ bash [~/hack/hg-test] 552 $> cd subdir 
./subdir 
$ bash [~/hack/hg-test/subdir] 553 $> hg status 
? foo 
? subdir/bar 
$ bash [~/hack/hg-test/subdir] 553 $> hg status . 
? bar 
$ bash [~/hack/hg-test/subdir] 513 $> hg status $(hg root) 
? ../foo 
? bar 
$ bash [~/hack/hg-test/subdir] 523 $> hg status 
? foo 
? subdir/bar 

इसलिए, आप क्योंकि मैं उपयोग कर रहा हूँ में जाँच के बिना, स्थानीय सबट्री में फ़ाइलों की एक बैकअप बनाने, और फिर वापस लौटने (मैं अक्सर, ऐसा करने की जरूरत है जब "एचजी लॉक" का उपयोग कर की तरह कुछ करना चाहते हैं, तो FrameMaker फ़ाइलों को diffed किये जाने वाले नहीं किया जा सकता या विलय कर दिया एचजी के भीतर (या मुश्किल से सभी)):

$ bash [~/hack/hg-test/subdir] 523 $> mkdir bak; hg status -n . | xargs cp --target-directory bak 
$ bash [~/hack/hg-test/subdir] 524 $> ls bak 
bar 

लेकिन तुम पेड़ कि स्थिति

$ bash [~/hack/hg-test/subdir] 528 $> mkdir bak-root; hg status -n $(hg root) | xargs cp --target-directory bak-root 
cp: will not overwrite just-created `bak-root/bar' with `bar' 
$ bash [~/hack/hg-test/subdir] 529 $> ls bak-root 
bar foo 

द्वारा रिपोर्ट कर रहे हैं के द्वारा सभी फ़ाइलों का बैकअप करना चाहते हैं वा वाई, चेतावनी फाइलनामों को टकराव करने की समस्याओं को दिखाता है। मैं आम तौर पर एक छोटा सा उपकरण उपयोग करता हूं जिसे मुझे एक .bak प्रत्यय, या xargs जोड़ना है। लेकिन यह उदाहरण पर्याप्त है।

जिस तरह से^2, मैं आमतौर पर "एचजी स्थिति-एनएम" के साथ इस तरह की चीजें करता हूं, लेकिन ऊपर दिया गया उदाहरण पर्याप्त है।

2

मानक तरीका है कि पुराने तेज संस्करणों (> = 1.1 2008 से) के बाद से काम करता है:

hg status re: 

जो पैदावार:

M ../contrib/buildrpm 
M ../hg 
M httprepo.py 

के बाद से तेज 1,3 (2009) आप यदि आप चाहें तो alias परिभाषित कर सकते हैं:

[alias] 
sst = status re: 

यह व्यवहार अंत में 3,4 (2015) में दर्ज किया गया था:

$ hg help status --verbose 
[...] 
- show changes in the working directory relative to the current directory 
    (see 'hg help patterns' for more information): 

    hg status re: 

के बाद से तेज 4.2 (2017 मई) आप स्थिति कमांड बता सकते हैं हमेशा अपने hgrc में इस डाल संबंधित पथ मुद्रित करने के लिए:

[commands] 
status.relative = True 

परीक्षण सीधे कमांड लाइन पर (Hg> = 4.2):

$ hg --config commands.status.relative=True status 
M ../contrib/buildrpm 
M ../hg 
M httprepo.py 

अंत में, अस्थिर 4.3 शुरू की ui.tweakdefaults जो अन्य बातों के अलावा, अधिक आधुनिक लोगों के लिए कुछ चूक परिवर्तन:

[ui] 
# hg status prints relative paths 
# hg diff produces patches in git format 
tweakdefaults = True 

आप एक आधुनिक अस्थिर (> = 4.3) पर कर रहे हैं, यह आधिकारिक तौर पर की सिफारिश की है मार्ग।

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