2009-01-07 14 views
129

मैं फ़ाइल में सभी परिवर्तनों को रिकॉर्ड करने के लिए गिट का उपयोग करना चाहता हूं।गिट ऑटो-प्रतिबद्ध बनाना

क्या कोई तरीका है कि जब भी कोई फ़ाइल अपडेट हो जाती है तो मैं स्वचालित रूप से गिट 'प्रतिबद्ध' चालू कर सकता हूं - इसलिए फाइल में हर बदलाव के लिए एक नई प्रतिबद्धता है?

आदर्श रूप से मैं अपने उपयोगकर्ताओं को यह भी नहीं जानना चाहता कि दृश्यों के पीछे गिट चल रहा है। एक उपयोगकर्ता तब फ़ाइल में संभावित रूप से "पूर्ववत" परिवर्तन कर सकता है - और यह पिछले संस्करण को गिट से बाहर खींचकर हासिल किया जा सकता है।

+6

एक संस्करण फ़ाइल सिस्टम का उपयोग करना आसान होगा: http://en.wikipedia.org/wiki/Versioning_file_system –

+1

स्पार्कलेशेयर उस पर काफी प्रभावशाली था। – theode

उत्तर

102

लिनक्स पर आप inotifywait का उपयोग कर सकते हैं ताकि फ़ाइल की सामग्री हर बार स्वचालित रूप से कमांड निष्पादित हो सके।

संपादित करें: निम्न आदेश जैसे ही यह सहेजा जाता है file.txt करता है:

inotifywait -q -m -e CLOSE_WRITE --format="git commit -m 'autocommit on change' %w" file.txt | sh 
+0

आप इसे पूरे फ़ोल्डर के लिए कैसे कर सकते हैं (केवल एक फ़ाइल नहीं?) –

+1

'inrifywait' पर' -r' ध्वज का उपयोग करें, लेकिन ध्यान दें कि कर्नेल में सेट किए जा सकने वाले इनोटिफाइवेट घड़ियों की संख्या पर एक सीमा है अप। 'आदमी inotifywait' आपको और बताएगा। – JesperE

+9

विंडोज़ में कोई विकल्प है ..? –

1

मुझे पूरा यकीन है कि आपको उस उपयोगकर्ता को जो भी संपादक उपयोग कर रहे हैं उसे हुक करने की आवश्यकता होगी। आप परिवर्तनों के लिए मतदान के लिए कुछ लिख सकते हैं, लेकिन उपयोग पैटर्न के आधार पर, मतदान आवृत्ति को यह सुनिश्चित करने के लिए अविश्वसनीय रूप से उच्च होने की आवश्यकता हो सकती है कि यह कई परिवर्तनों के बजाय व्यक्तिगत परिवर्तन उठा रहा हो।

+0

इसके अलावा, परिवर्तनों के लिए मतदान दौड़ की स्थिति पैदा करेगा। – Bombe

+1

emacs और yi जैसे संपादकों के साथ नहीं, जो यह सुनिश्चित करने के लिए "लेनदेन" फाइलें लिखते हैं कि क्रैश के बाद डेटा खो जाएगा नहीं। –

2

आप फ़ाइल का नाम जानते हैं और आप केवल एक (या कुछ फ़ाइलें) की निगरानी करना चाहते हैं, तो आप इसे प्राप्त करने के लिए बस कुछ ही मिनटों में "गिट प्रतिबद्ध" को कॉल कर सकते हैं। अगर फ़ाइल नहीं बदली है, तो गिट सिर्फ शिकायत करेगा और आपको इस त्रुटि को अनदेखा करना होगा, लेकिन इसके अलावा, कोई भ्रष्टाचार नहीं होगा।

इसके अलावा, आप मैन्युअल रूप से प्रतिबद्ध करने में सक्षम होने के लिए इन फ़ाइलों को "ऑटो प्रतिबद्ध" के रूप में चिह्नित करना चाहेंगे। इस तरह, उपयोगकर्ता स्वचालित परिवर्तन देख सकते हैं और बड़े "तार्किक" परिवर्तन भी देख सकते हैं जो कि अंतिम मैन्युअल प्रतिबद्धता के बाद से बदल गए हैं।

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

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

आखिरकार, आप मैन्युअल और स्वचालित संस्करणों के बीच अंतर करने के लिए स्वत: काम करते समय फ़ाइल को एक नए नाम ("$ filename.ac") पर प्रतिलिपि बना सकते हैं।

42

पहले inotifywait उत्तर बहुत अच्छा है, लेकिन यह काफी पूरा समाधान नहीं है। लिखित रूप में, यह एक फ़ाइल में एक बार परिवर्तन के लिए एक शॉट प्रतिबद्ध है। यह सामान्य मामले के लिए काम नहीं करता है जहां फ़ाइल संपादित करना मूल नाम के साथ एक नया इनोड बनाता है। inotifywait -m स्पष्ट रूप से नाम से नहीं, इनोड द्वारा फ़ाइलों का पालन करता है। साथ ही, फ़ाइल बदल जाने के बाद, गिट प्रतिबद्धगिट या गिट प्रतिबद्ध -a के बिना यह चरणबद्ध नहीं है। कुछ समायोजन करना, यहां मैं अपनी कैलेंडर फ़ाइल में सभी परिवर्तनों को ट्रैक करने के लिए डेबियन पर उपयोग कर रहा हूं:

/etc/rc।स्थानीय:


su -c /home/<username>/bin/gitwait -l <username> 

/घर/< उपयोगकर्ता नाम >/bin/gitwait:


#!/bin/bash 
# 
# gitwait - watch file and git commit all changes as they happen 
# 

while true; do 

    inotifywait -qq -e CLOSE_WRITE ~/.calendar/calendar 

    cd ~/.calendar; git commit -a -m 'autocommit on change' 

done 

यह फ़ाइलों और/या निर्देशिका, और इसी inotifywait प्रक्रियाओं की एक सूची पर प्रतीक्षा करने के लिए सामान्यीकृत किया जा सकता है , और एक फ़ाइल के रूप में प्रत्येक inotifywait को पुनरारंभ करें।

+6

लेस्टर क्या आप कृपया सामान्यीकृत करने के तरीके पर विस्तार कर सकते हैं यह एक निर्देशिका के लिए? – Diego

1

मुझे एक ही समस्या थी और मैक लॉन्च पर आपको एक अच्छा समाधान प्रदान करता है। यह एक फ़ाइल या निर्देशिका देखेगा और यदि कोई परिवर्तन हो तो आप एक ऐप या कुछ और चला सकते हैं ...

+0

यहां "निर्देशिका की निगरानी" देखें: http://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLaunchdJobs.html – Kris

14

git-wip एक अच्छा समाधान है जो मेरे लिए अच्छा काम करता है। "डब्ल्यूआईपी" का अर्थ है "काम प्रगति पर है"। हर बार जब आप 'गिट वाइप' चलाते हैं, तो परिवर्तन एक अलग शाखा में किए जाते हैं। इसे कमांड लाइन पर चलाया जा सकता है, लेकिन फ़ाइल के लिखे जाने पर प्रत्येक बार स्वचालित रूप से गिट-वाइप चलाने के लिए विम और एमएक्स के लिए एक्सटेंशन होते हैं।

5

मैंने आपके स्थानीय गिट भंडारों के लिए ऑटोसव प्रदान करने के लिए एक प्रोग्राम, GitPrime लिखा था। इससे पहले कि आप इसे फेंकने से पहले वापस रोल करना आसान हो! Bitbucket repository

यह किसी भी प्लेटफ़ॉर्म पर काम करना चाहिए जो विंडोज + सिगविन सहित बैश खोल का समर्थन करता है।

+0

+1 मैं इसे विंडोज़ (साइगविन) पर उपयोग कर रहा हूं स्वत: सहेजने वाले बदलाव मैं एक निर्धारित कार्य – Darbio

7
#!/bin/bash 
git commit -a -m "autoupdate `date +%F-%T`" 
git push 

वर्तमान दिनांक और समय के साथ ऑटोपशिंग।

7

इनोटिफ़ वास्तव में नौकरी के लिए सही उपकरण की तरह लगता है।

incron नामक एक उपकरण है जो आप जो खोज रहे हैं वह हो सकता है। आप फ़ाइलों या फ़ोल्डरों (और घटना प्रकार, जैसे "परिवर्तन", "बनाएं", "अनलिंक") को क्रॉन्टाब जैसे कुछ में निर्दिष्ट कर सकते हैं, और ऐसी घटना होने पर चलाने के लिए एक आदेश निर्दिष्ट कर सकते हैं।

inotifywait (जो कि गरीब आदमी के क्रॉन sleep 10;do stuff का एनालॉग होगा) के विपरीत, यह हर घटना को पकड़ लेगा, न केवल पहले।

मैंने इसे स्वयं नहीं उपयोग किया है, लेकिन दस्तावेज़ीकरण से यह सेटअप के लिए बहुत जटिल नहीं दिखता है।

21

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

परिणामस्वरूप, एक स्क्रिप्ट वर्तमान में gitwatch कहा जाता है: यह परिवर्तन (inotifywait का प्रयोग करके) के लिए एक फ़ाइल या फ़ोल्डर देखता है, और उन्हें एक Git भंडार के लिए प्रतिबद्ध।

आप GitHub पर स्क्रिप्ट, अधिक जानकारी और निर्देश से अधिक प्राप्त कर सकते हैं: https://github.com/nevik/gitwatch

+3

उपयोगी छोटी स्क्रिप्ट का उपयोग करके हर 10 मिनट में एक गिट-टीएफ भंडार में बना देता हूं। मैं इसका एक नोट बनाउंगा। – iwein

+0

दिलचस्प Magento साइटों के लिए उपयोगी हो सकता है। मैं इसका परीक्षण कर रहा हूं लेकिन इसे स्वचालित रूप से – NoSixties

10

मैं खिड़कियों में ऐसा करना चाहता था, और पाया सबसे अच्छा तरीका है परिवर्तन की जाँच करना Directory Monitor का इस्तेमाल किया गया तो जब यह परिवर्तन का पता लगा इसे चलाएं:

प्रोग्राम: cmd।exe

पैरामीटर: /CC:\pathToBatchFile.bat

बैच फ़ाइल निहित है कि:

c: 
cd c:\gitRepoDirectory\ 
(if exist "%PROGRAMFILES(X86)%" (
"%PROGRAMFILES(X86)%\git\bin\sh.exe" --login -i -c "git commit -am AutoCommitMessage" 
) else (
"%PROGRAMFILES%\git\bin\sh.exe" --login -i -c "git commit -am AutoCommitMessage" 
)) 

मैं भी फ़ाइलें ("%PROGRAMFILES(X86)%\git\bin\sh.exe" --login -i -c "git add *.*") जोड़ने के लिए वहाँ में एक और आदेश होने की कोशिश की, लेकिन मैं नहीं मुझे लगता है कि मैं ठीक से काम कर रहा है।

मैं भी एक के बाद प्रतिबद्ध हुक से युक्त बनाया:

#!/bin/sh 
git.exe pull -v --progress "origin" 
git.exe push --progress "origin" master:master 
curl.exe -s https://webserverdomain.com/updateFromGitHook.x?r=repoName 

(अगर कोई संघर्ष थे तो यह पुल गर्भपात और धक्का गर्भपात होगा, लेकिन क्या कोई स्पष्ट रास्ता बताने के लिए है कि नहीं था हुआ - अंत में हमने इस विचार के कारण पूरे विचार को त्याग दिया।)

उस कर्ल कमांड ने मेरे सर्वर से कहा कि उसे कोड पर खींचने की आवश्यकता है। सभी कि php में इसे संभाल करने के लिए आवश्यक किया गया था:

<? 
$r = $_GET['r']; 
if (!empty($c)) { 
    //use system instead of exec if you want the output to go back to the git client 
    exec("cd /path/to/repo/parent/$r; sudo git reset --hard HEAD; sudo git pull;"); 
    echo "\n\nServer: Updated\n\n"; 
} else { 
    echo "\n\nServer: UPDATE FAILED\n\n"; 
} 
?> 

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

www-data ALL = NOPASSWD: /usr/bin/git 

मेरे लिए, मुझे लगता है कि यह काफी ठोस काम करता है। निर्देशिका मॉनिटर स्टार्टअप पर चलाने के लिए और कम से कम शुरू विन्यस्त किया जा सकता है, और यह कई अलग अलग फ़ोल्डरों

+0

+1 को धक्का देने के लिए प्रतीत नहीं होता है। यह Mercurial – 79E09796

1

ऐसा लगता है कि आप etckeeper को कुछ इसी तरह, जो स्वत: करने के लिए अपने सभी changest जाँच करने के लिए डिज़ाइन किया गया है के लिए देख रहे/etc/देख सकते हैं * गिट (या जो भी वीसीएस आप चाहते हैं) में, लेकिन मुझे कोई कारण नहीं दिखता है कि इसे/etc के अलावा फ़ाइलों के साथ उपयोग नहीं किया जा सकता है।

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

1

यह स्क्रिप्ट तब नहीं चलती जब कोई उपयोगकर्ता फ़ाइल बदलता है, लेकिन इसे क्रॉन जॉब (इसे /etc/cron.* निर्देशिका में छोड़कर) के रूप में चलाया जा सकता है, जो एक उचित समाधान भी है।

यह स्क्रिप्ट आपके/srv/www निर्देशिका के माध्यम से फिर से शुरू हो जाएगी (जहां भी आपकी सभी साइटें संग्रहीत की जाती हैं), सभी फ़ाइलों को जोड़ें, प्रतिबद्ध करें और दबाएं, और /var/log/gitlog.txt

पर सबकुछ लॉग करें
now=$(date +"%m.%d.%Y_%T") 
logfile='/var/log/gitlog.txt' 

for dir in /srv/www/*/ 
do 
echo -e '\n' >> $logfile 
echo "autocommit $dir $now" >> $logfile 
echo "--------------------------" >> $logfile 

cd $dir 
git add . >> $logfile 
git commit -am "autocommit $now" >> $logfile 
git push origin master >> $logfile 
done 
4

मामले में किसी को भी Powershell से ऐसा करने की कोशिश करता है मैं निम्नलिखित का उपयोग कर सफलता मिली:

& "C:\Program Files (x86)\Git\bin\sh.exe" -c "cd D:\PATH\TO\REPO && git add --all && git commit -m 'Automatic Commit Message Goes Here' && git push origin master" 
+5

के साथ भी बहुत अच्छा काम करता है और यह स्वचालित रूप से कैसे ट्रिगर होता है? – jerik

+1

निर्धारित कार्य? – ozzy432836