गिट ऑटो करना


155

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

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

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


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

1
SparkleShare उस पर काफी प्रभावशाली था।
थियोड

SparkleShare एक शानदार विकल्प दिखता है, लेकिन यह मुख्य गिट के अंदर किसी भी .it फ़ोल्डर को नष्ट कर देता है
7:00 पर

आप github.com/jw0k/gwatch का उपयोग कर सकते हैं । यह विंडोज और लिनक्स पर काम करता है।
rubix_addict 12

@rubix_addict आपने उत्तर के रूप में पोस्ट क्यों नहीं किया?
टोबियास किंजलर

जवाबों:


127

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

संपादित करें: जैसे ही यह सहेजा जाता है, निम्न कमांड फ़ाइल टाइप करती है:

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

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

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

14
क्या खिड़कियों में कोई विकल्प है ..?
चंदन पसूनूरि

50

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

/etc/rc.local:


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 को पुनरारंभ करें ।


8
लेस्टर क्या आप इस पर विस्तार कर सकते हैं कि इसे निर्देशिका में कैसे सामान्य किया जाए?
डिएगो

29

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

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

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


4
वहाँ उपयोगी छोटी स्क्रिप्ट। मैं इसे नोट कर लूंगा।
इविन

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

16

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


12

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

कार्यक्रम: cmd.exe

परम: /सीसी: ENDpathToBatchFile.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

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


विंडोज पर भी, मुझे लोकल सिस्टम के तहत चलने के लिए git नहीं मिल सकता है, इसलिए यदि आप अपनी स्वयं की निगरानी सेवा बनाते हैं, तो आपको इसे एक उपयोगकर्ता के अंतर्गत चलाना होगा जो वास्तव में Git चला सकता है। संभव है कि मैं सिर्फ कुछ सेटिंग्स /
कॉन्फिगरेशन को

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

वर्तमान तिथि और समय के साथ निरंकुश।


8

वास्तव में काम के लिए सही उपकरण की तरह लगता है।

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

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

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


7

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

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


+1 मैं इसे (साइगविन) खिड़कियों पर ऑटोसैव में बदलाव के लिए उपयोग कर रहा हूं, मैं एक निर्धारित कार्य का उपयोग करके प्रत्येक 10 मिनट में गिट-टीएफ रिपॉजिटरी में करता
हूं

6

मामले में किसी ने 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
और यह अपने आप कैसे शुरू हो जाता है?
जर्क

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

4

दो समाधान जो मुझे पसंद हैं वो हैं etckeeper - जिसे एक कस्टम डायरेक्टरी के अलावा अनुकूलित किया जा सकता है /etc:

mkdir /foo
etckeeper -d /foo init`
etckeeper -d /foo commit 'message'

और गिटवाच - विशेष रूप से इसके साथ उपयोग करनेsupervisord के निर्देश ।


2

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

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

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

एक अन्य विकल्प अपने स्वयं के विशेष भंडार के निर्माण के लिए git निम्न-स्तरीय कमांड का उपयोग करना है।

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


1

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


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

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

1

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

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


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

0

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


यहां "एक निर्देशिका की निगरानी करना" देखें: developer.apple.com/library/mac/#documentation/MacOSX/…
Kris

0

मैंने फाइलों की स्थिति पर नजर रखने और निर्माण सफलता पर कमिट करने जैसी कमांड को ट्रिगर करने के लिए इस छोटे शेल स्क्रिप्ट को बनाया।

बेझिझक डाउनलोड करें और इसे आज़माएं।

https://github.com/nzvincent/nzvincent-github/blob/master/inotify-tools/inotify.sh


0

यह प्रश्न के "आदर्श रूप से" भाग को संतुष्ट नहीं करता है, लेकिन यह निकटतम सवाल था जो मैंने उस उत्तर को देखा था जिसे मैं चाहता था, इसलिए मुझे लगा कि यह यहां जा सकता है। मेरा पहला स्टैकओवरफ़्लो पोस्ट हालांकि, माफी चाहता हूँ अगर मैं गलत हूँ।

निम्न स्क्रिप्ट सहेजे गए बदलावों पर स्वत: प्रतिबद्ध सुनिश्चित करता है, लेकिन करता है शीघ्र इनपुट को के लिए उपयोगकर्ता। (मुझे पता है कि मेरा परिदृश्य git-noob से थोड़ा अलग है)।


# While running, monitors the specified directory, and when a file therein 
# is created or edited and saved, this prompts the user for a commit message.
# The --exclude is to avoid extra prompts for the changes made to 
# version control directories.

# requires inotify-tools

inotifywait --exclude '/\..+' -m  path/to/directory -e modify -e create |
        while read path action file; do
                gnome-terminal -e 'bash -c "cd path/to/directory; 
                                            git add *; 
                                            echo What did you just do??; 
                                            read varname; 
                                            git commit -m \"$varname\""'
        done

0

विंडोज के लिए

ऑटोकॉमिट के बारे में इस लेख के अनुसार , आप .batसामग्री के साथ फ़ाइल बनाएँ :

git add -u
git commit -m "your commit message"
git push origin master 

और साथ निष्पादित Task Scheduler। यदि आप चरण-दर-चरण नहीं जानते हैं, तो उस लेख को देखें।

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