.signignore और .hignignore और svn के अनुसार rsync को बाहर करें: जैसे --filter = C पर ध्यान न दें


113

रुपये में निफ्टी --cvs-exclude"सीवीएस करता है" उसी तरह फाइलों को अनदेखा करने का एक निफ्टी विकल्प शामिल है , लेकिन सीवीएस वर्षों से अप्रचलित है। क्या इसे बनाने के लिए कोई तरीका भी है जो उन फ़ाइलों को शामिल करता है जिन्हें आधुनिक संस्करण नियंत्रण प्रणालियों (Git, Mercurial, Subconersion) द्वारा अनदेखा किया जाएगा?

उदाहरण के लिए, मैं GitHub से बाहर की जाँच की बहुत सारी Maven परियोजनाएं हैं। आमतौर पर वे एक .gitignoreसूची में कम से कम target, डिफ़ॉल्ट मावेन बिल्ड निर्देशिका (जो शीर्ष स्तर पर या सबमॉडुल्स में मौजूद हो सकते हैं) शामिल हैं। चूंकि इन निर्देशिकाओं की सामग्री पूरी तरह से डिस्पोजेबल है, और वे स्रोत कोड से कहीं अधिक बड़े हो सकते हैं, मैं बैकअप के लिए rsync का उपयोग करते समय उन्हें बाहर करना चाहूंगा।

निश्चित रूप से मैं स्पष्ट रूप से कह सकता हूं --exclude=target/लेकिन यह गलती से असंबंधित निर्देशिकाओं को दबा देगा जो कि केवल नाम के रूप में targetहोते हैं और इसे अनदेखा नहीं किया जाना चाहिए।

और मैं अपनी डिस्क पर सभी फ़ाइल नाम और किसी भी .gitignore, .hgignoreया svn:ignoreसंपत्ति में वर्णित पैटर्न के लिए निरपेक्ष पथों की एक पूरी सूची की आपूर्ति कर सकता हूं, लेकिन यह एक बड़ी सूची होगी जो किसी प्रकार की स्क्रिप्ट द्वारा निर्मित की जाएगी।

चूंकि rsync में CVS के अलावा VCS चेकआउट के लिए कोई अंतर्निहित समर्थन नहीं है, क्या यह उनके अनदेखा पैटर्न को खिलाने के लिए कोई अच्छी चाल है? या किसी प्रकार की कॉलबैक प्रणाली जिससे उपयोगकर्ता स्क्रिप्ट से पूछा जा सकता है कि क्या दी गई फ़ाइल / निर्देशिका को शामिल किया जाना चाहिए या नहीं?

अपडेट : --filter=':- .gitignore'जैसा कि लॉर्डजैव द्वारा सुझाया गया --filter=:Cहै, सीवीएस के लिए Git के लिए भी काम करता है, कम से कम मेरे द्वारा पाए गए उदाहरणों पर, हालांकि यह स्पष्ट नहीं है कि क्या सिंटैक्स सटीक मिलान है। --filter=':- .hgignore'मर्क्यूरियल के लिए बहुत अच्छा काम नहीं करता है; उदाहरण के लिए ( रेगुलर समतुल्य Git ) की .hgignoreतरह एक लाइन युक्त एक नियमित अभिव्यक्ति के रूप में rsync द्वारा मान्यता प्राप्त नहीं है। और कुछ भी तोड़फोड़ के लिए काम नहीं करता है, जिसके लिए आपको 1.6 या इससे पहले काम करने वाली कॉपी के लिए पार्स करना होगा , और 1.7 या बाद में काम करने वाली कॉपी के लिए अपने हाथों को फेंकना होगा।^target$/target/.svn/dir-prop-base


11
थोड़ा सा लगता है कि यह rsync के लिए एक पैच प्रस्तुत करने के लिए एक अच्छा विचार होगा जो .itignore, .hignignore, आदि के लिए समर्थन जोड़ता है
ThiefMaster

3
@ThiefMaster: मैंने Bugzilla.samba.org/show_bug.cgi?id=9744 को एक प्रारंभिक बिंदु के रूप में दर्ज किया ।
जेसी ग्लिक

2
दूसरों के लिए सिर्फ एक नोट; .ignignore को फ़ोल्डर hierarchy में rysnc'd होने की जरूरत है, न कि डायरेक्टरी को कमांड निष्पादित किया जा रहा है
myol

:-वास्तव में क्या मतलब है? कोलन का क्या अर्थ है? पानी का छींटा क्या?
डेविड

Git के पास अब एक check-ignoreउपकेंद्र है जो विभिन्न "अनदेखा" फ़ाइलों को पार्स करने की कड़ी मेहनत से निपट सकता है, यदि आप "सभी गैर-अनदेखा" फ़ाइलों के विकल्प की एक सूची बनाना चाहते हैं। यहाँ मेरा उत्तर यह बताता है कि यह कैसे करना है।
cjs

जवाबों:


120

जैसा कि ल्यूकसन ने उल्लेख किया है, आप इसे --filterस्विच के साथ कर सकते हैं rsync। मैंने इसे --filter=':- .gitignore'(".ignignore" से पहले एक स्थान प्राप्त किया है ) जो फाइलों के rsyncसाथ एक निर्देशिका मर्ज करने के लिए कहता है .gitignoreऔर उन्हें प्रति नियम नियमों को बाहर करता है। यदि आपके पास एक है तो आप अपनी वैश्विक उपेक्षा फ़ाइल को भी जोड़ना चाह सकते हैं। इसका उपयोग करना आसान बनाने के लिए, मैंने एक उपनाम बनाया rsyncजिसमें फ़िल्टर शामिल था।


एक अच्छी शुरुआत, हालांकि मैं इस जवाब को "स्वीकार" करने में संकोच करता हूं क्योंकि यह केवल गिट को कवर करता है।
जेसी ग्लिक

23
एक अधिक वर्बोज़ संस्करण, जो --exclude='/.git' --filter="dir-merge,- .gitignore"
.it

2
मेरे पास अब ऐसा कुछ है: rsync -rvv --exclude='.git*' --exclude='/rsync-to-dev.sh' --filter='dir-merge,-n /.gitignore' $DIR/ development.foobar.com:~/test/.. लेकिन यद्यपि यह कहता है [sender] hiding file .gitignore because of pattern .git*, फ़ाइल अभी भी विचलन के लिए भेजी जाती है
rolandow

2
यदि आप --deleteविकल्प का उपयोग करना चाहते हैं , तो यहां काम करने की कमांड लाइन है rsync --delete-after --filter=":e- .gitignore" --filter "- .git/" -v -a ...:। यह मुझे थोड़ी देर लगा ... eफिल्टर में और --delete-afterदोनों महत्वपूर्ण हैं। मेरा सुझाव है कि rsyncमैन पेज का "पर्फेक्ट-डाइरेक्टरी रूल्स एंड डिलीट" चैप्टर पढ़ना ।
dbolotin

1
--delete-afterडिलीट और अपडेट्स को सिंक करने के लिए, आप बस @ VasiliNovikov कमांड के संस्करण में जोड़ सकते हैं । (यह @ dbiton कमांड के वर्जन के बराबर लगता है, सिवाय @db के उपयोग के: ई जो मुझे लगता है कि कॉपी होने से .itignore फाइल को बाहर कर देता है, जो कि मैं नहीं चाहता था।)
Bampfer

10

आप git ls-filesरिपॉजिटरी की .gitignoreफ़ाइलों द्वारा बाहर की गई फ़ाइलों की सूची बनाने के लिए उपयोग कर सकते हैं । https://git-scm.com/docs/git-ls-files

विकल्प:

  • --exclude-standardसभी .gitignoreफाइलों पर विचार करें।
  • -o अस्थिर परिवर्तनों को अनदेखा न करें।
  • -i केवल आउटपुट फ़ाइलों की अनदेखी की।
  • --directory केवल निर्देशिका पथ का आउटपुट करें यदि संपूर्ण निर्देशिका को अनदेखा कर दिया जाए।

केवल एक चीज जिसे मैंने नजरअंदाज करना छोड़ दिया था .git

rsync -azP --exclude=.git --exclude=`git -C <SRC> ls-files --exclude-standard -oi --directory` <SRC> <DEST>

4
यह काम नहीं करता है। यह git उपकमांड से पहली फ़ाइल को बाहर करता है और फिर SRC सूची के भाग के रूप में शेष को मानता है। यह काम करता है: rsync -azP --exclude-from="$(git -C SRC ls-files --exclude-standard -oi --directory > /tmp/excludes; echo /tmp/excludes)" SRC DEST
मैराथन

2
यह एकमात्र तरीका है जो काम करता है यदि आप दोनों को बाहर करते हैं और आपके .gitignore(यानी शुरू होने वाली लाइनें !) में लाइनें शामिल करते हैं । यह उन फ़ाइलों को भी rsyncs करता है जिन्हें आपने --forceअपने रेपो में जोड़ा था, जो आमतौर पर एक अच्छी बात है।
ओस्ट्रोकैच

1
वास्तव में यह जवाब काम नहीं करता है, इसलिए मैंने एक काम करना समाप्त कर दिया है: stackoverflow.com/a/50059607/99834
sorin

6

कैसे के बारे में rsync --exclude-from='path/.gitignore' --exclude-from='path/myignore.txt' source destination?
इसने मेरे लिए काम किया।
मेरा मानना ​​है कि आपके और --exclude-fromभी पैरामीटर हो सकते हैं ।


3
यह आपकी .gitignoreफ़ाइलों के साथ संगत सिंटैक्स का उपयोग करने के लिए घटित होने पर काम करेगा rsync
जेसी ग्लिक

@JesseGlick सही है, rsync .itignoreore फाइलों को पार्स करने में सक्षम नहीं है, देखें stackoverflow.com/a/50059607/99834 कार्यक्षेत्र।
सोरिन

6

2018 समाधान की पुष्टि की

rsync -ah --delete 
    --include .git --exclude-from="$(git -C SRC ls-files \
        --exclude-standard -oi --directory >.git/ignores.tmp && \
        echo .git/ignores.tmp')" \
    SRC DST 

विवरण: --exclude-from--exclude के बजाय अनिवार्य है क्योंकि संभावना है कि बहिष्कृत सूची को तर्क के रूप में पार्स नहीं किया जाएगा। एक फ़ाइल की आवश्यकता होती है और पाइप से काम नहीं कर सकता।

वर्तमान समाधान .गित फ़ोल्डर के अंदर बाहर की गई फ़ाइल को बचाता है ताकि यह सुनिश्चित हो सके कि git statusयह स्वयं को निहित रखते हुए प्रभावित नहीं करेगा । यदि आप चाहते हैं कि आप का उपयोग / tmp में स्वागत है।


3
ऐसा लगता है कि यह काम करेगा यदि आपके पास एक विशेष Git रिपॉजिटरी है जिसे आप SRCयहाँ सिंक्रोनाइज़ करना चाहते हैं - लेकिन मेरे द्वारा बताई गई मूल समस्या के लिए नहीं, जो कि हजारों Git रिपॉजिटरी के साथ विभिन्न गहराई पर उपनिर्देशिका के रूप में एक विशाल निर्देशिका है, जिनमें से कई हैं idiosyncratic .gitignores।
जेसी ग्लिक

1
यदि आप प्रक्रिया प्रतिस्थापन (बाश, zsh, आदि) के लिए समर्थन के साथ एक शेल का उपयोग कर रहे हैं, तो आप उपयोग कर सकते हैं--exclude-from=<(git -C SRC ls-files --exclude-standard -oi --directory)
रोलाण्ड डब्ल्यू

3

के लिए अस्थिर आप उपयोग कर सकते हैं

hg status -i | sed 's/^I //' > /tmp/tmpfile.txt

उन फ़ाइलों की सूची एकत्र करने के लिए जो कि .gignore प्रतिबंधों के कारण व्यापारिक नियंत्रण में नहीं हैं और फिर चलते हैं

rsync -avm --exclude-from=/tmp/tmpfile.txt --delete source_dir/ target_dir/

सभी फाइलों को अनदेखा करने के लिए rsync करने के लिए। Rsync में सूचना -एम झंडा, जो खाली निर्देशिकाओं को सिंक्रनाइज़ करने से बाहर कर देगा क्योंकि hg स्थिति -i केवल बाहर रखी गई फ़ाइलों की सूची देगी, डायर नहीं


2

इसे इस्तेमाल करे:

rsync -azP --delete --filter=":- .gitignore" <SRC> <DEST>

यह '.gitignore' में फ़ाइलों को छोड़कर दूरस्थ निर्देशिका में सभी फ़ाइलों को कॉपी कर सकता है, और फ़ाइलों को आपकी वर्तमान निर्देशिका में नहीं हटा सकता है।


1

rsyncफ़ाइल पैटर्न की मानक सूची के अतिरिक्त, मैन पेज प्रति :

$ Home / .cvsignore में सूचीबद्ध फ़ाइलें सूची में जोड़ी गई हैं और CVSIGNORE वातावरण में सूचीबद्ध कोई भी फ़ाइलें

तो, मेरी $ HOME / .cvsignore फाइल इस तरह दिखती है:

.git/
.sass-cache/

.it और Sass द्वारा उत्पन्न फ़ाइलों को बाहर करने के लिए ।


2
इसके विपरीत, मैं निश्चित रूप से .git/निर्देशिकाओं को शामिल करना चाहता हूं , शायद काम की नकल से भी अधिक दृढ़ता से। क्या मैं बाहर करना चाहता हूँ उत्पादों का निर्माण कर रहे हैं।
जेसी ग्लिक जूल

इसके अलावा, यह सेटिंग पोर्टेबल नहीं है। यह प्रति-उपयोगकर्ता है, प्रति-प्रोजेक्ट नहीं।
वासिलीनोविकोव

@JesseGlick मैं आपको .it / dirs शामिल रखने के बारे में दूसरा कहता हूं। एक वितरित SCM होने के नाते, पूरे स्थानीय रिपॉजिटरी का बैकअप लेना महत्वपूर्ण है।
जोहान बोले

1 / rsyncइस उत्तर में उद्धृत मैन पेज से वाक्य --cvs-excludeविकल्प का वर्णन करता है, इसलिए आपको इसे स्पष्ट रूप से उपयोग करना होगा। 2 / आप .cvsignoreकिसी भी निर्देशिका में प्रोजेक्ट-विशिष्ट इग्नोर करने के लिए फाइल बना सकते हैं , जिन्हें पढ़ा भी जाता है। 3 / .gitपहले से ही नजरअंदाज कर दिया जाता है जब आप उपयोग करते हैं --cvs-exclude, मैनुअल के अनुसार, इसलिए यह $HOME/.cvsignoreबेमानी लगता है।
नियावल्स

1

मेरे पास बहुत बड़ी .gitignoreफ़ाइलों की संख्या थी और "शुद्ध rsync" समाधानों में से कोई भी मेरे लिए काम नहीं करता था। मैंने यह rsync आवरण स्क्रिप्ट लिखी , यह पूरी तरह से .gitignoreनियमों का सम्मान करती है ( उप - !श्रेणियों में -स्टाइल अपवाद और .gitignoreफ़ाइलों को शामिल करें) और मेरे लिए एक आकर्षण की तरह काम किया है।


के माध्यम से इस कोशिश कर रहा है locate -0e .gitignore | (while read -d '' x; do process_git_ignore "$x"; done), लेकिन मुद्दों की एक बहुत कुछ है। एक ही डायरेक्टरी की फाइलें .gitignoreजिस डायरेक्ट्री नेम से सही से अलग नहीं की हैं /। गलत पंक्तियों और टिप्पणियों की गलत व्याख्या की गई। .gitignoreरिक्त स्थान के साथ रास्तों की फाइलों पर चुटकुले ( उबंटू के लिए पैकेज /opt/vagrant/embedded/gems/gems/rb-fsevent-0.9.4/spec/fixtures/custom 'path/.gitignoreसे पैशाचिक को कभी भी मन न करें vagrant)। शायद बेहतर एक पर्ल स्क्रिप्ट के रूप में किया जाता है।
जेसी ग्लेक

@JesseGlick मुझे यकीन नहीं है कि आप स्क्रिप्ट के भीतर फ़ंक्शन को क्यों बुला रहे हैं। यह rsyncविशिष्ट कारण के लिए ड्रॉप-इन प्रतिस्थापन के रूप में उपयोग करने का इरादा है , उद्धरण / व्हाट्सएप को संभालना एक ऐसा दर्द है। यदि आपके पास एक gsyncकमांड लाइन का एक उदाहरण है जो विफल हो रहा है, और .gitignoreइसके साथ जुड़ी फाइलें, मुझे एक नज़दीकी नज़र लेने में खुशी होगी।
कोबज़िला

मुझे rsyncएक संपूर्ण फाइलसिस्टम की आवश्यकता है , जिसके चारों ओर विभिन्न गिट रिपॉजिटरी बिखरे हुए हैं। शायद आपकी स्क्रिप्ट एकल रिपॉजिटरी को सिंक्रनाइज़ करने के मामले में ठीक काम करती है।
जेसी ग्लिक

1
हाँ बिलकुल। खेद है कि मैंने यह स्पष्ट नहीं किया। इस स्क्रिप्ट के साथ, आपको इसे रेपो डायरेक्टरी के भीतर से एक बार git repo के अनुसार मंगाना होगा।
कोबजिला

0

Rsync (1) में MERGE-FILES फ़िल्टर फ़िल्टर अनुभाग देखें।

ऐसा लगता है कि rsync --filter नियम बनाना संभव है जिसमें निर्देशिका संरचना को ट्रैवर्स के रूप में .ignignore फाइलें शामिल होंगी।


0

अपवर्जित फिल्टर बनाने के बजाय, आप git ls-filesrsync के लिए प्रत्येक फ़ाइल का चयन करने के लिए उपयोग कर सकते हैं :

#!/usr/bin/env bash

if [[ ! $# -eq 2 ]] ; then
    echo "Usage: $(basename $0) <local source> <rsync destination>"
    exit 1
fi

cd $1
versioned=$(git ls-files --exclude-standard)
rsync --verbose --links --times --relative --protect-args ${versioned} $2

यह तब भी काम करता है, जब git ls-filesन्यूलाइन अलग किए गए रास्ते लौटाता है। यदि आप फ़ाइल नाम में रिक्त स्थान के साथ फ़ाइल संस्करण है तो शायद काम नहीं करेगा।


0

विकल्प:

git ls-files -zi --exclude-standard |rsync -0 --exclude-from=- ...

git ls-files -zi --exclude-per-directory=".gitignore" |...

(rsync केवल आंशिक रूप से समझता है। .ignignore)


0

संक्षिप्त जवाब

rsync -r --info=progress2 --filter=':- .gitignore' SOURCE DEST/

पैरामीटर अर्थ:

-r: पुनरावर्ती

--info=...: प्रगति दिखाएं

--filter=...: .ignignore फ़ाइल पर सूचीबद्ध नियमों को छोड़कर

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.