Git otomatik taahhüdü yapma


155

Bir dosyadaki tüm değişiklikleri kaydetmek için git'i kullanmak istiyorum.

Git 'taahhüt' seçeneğini bir dosya her güncellendiğinde otomatik olarak gerçekleşebilmem için bir yol var mı?

İdeal olarak, kullanıcılarımın git'in perde arkasında çalıştığını bile bilmemelerini istiyorum. Kullanıcı daha sonra bir dosyadaki değişiklikleri "geri alabilir" ve bu, önceki bir sürümü git'ten çekerek elde edilebilir.


9
Sürüm oluşturma dosya sistemi kullanmak daha kolay olurdu: en.wikipedia.org/wiki/Versioning_file_system
William Pursell

1
SparkleShare bu konuda oldukça etkileyiciydi.
17'de teori

SparkleShare harika bir seçenek gibi görünüyor ama ana git içindeki herhangi bir .git klasörünü yok ediyor
insign

Github.com/jw0k/gwatch kullanabilirsiniz . Windows ve Linux üzerinde çalışır.
rubix_addict

@rubix_addict Bunu neden cevap olarak göndermediniz?
Tobias Kienzler

Yanıtlar:


127

Linux'ta, bir dosyanın içeriği her değiştiğinde otomatik olarak bir komut yürütmek için inotifywait kullanabilirsiniz .

Düzenleme: Aşağıdaki komut kaydedilir kaydedilmez file.txt dosyasını işler:

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

2
Bunu tüm bir klasör için nasıl yapabilirsiniz (sadece tek bir dosya değil)
Anderson Green

2
Kullanım -rbayrağı inotifywaitçekirdeği o ayarlayabilirsiniz inotifywait saatler sayısına bir limiti olduğunu, ancak not. man inotifywaitsize daha fazlasını anlatacak.
JesperE

14
pencerelerde herhangi bir seçenek var mı ..?
Chandan Pasunoori

50

Daha önce inotifywait yanıtı harika, ama tam bir çözüm değil. Yazıldığı gibi, bir dosyadaki bir defalık değişiklik için tek seferlik bir taahhüttür. Bir dosyayı düzenlemenin orijinal adla yeni bir inode oluşturduğu yaygın durum için çalışmaz. inotifywait -m görünüşe göre dosyaları isimle değil inode ile izler. Ayrıca, dosya değiştikten sonra git add veya git commit -a olmadan git commit için sahnelenmez . Bazı ayarlamalar yapmak, Takvim dosyamdaki tüm değişiklikleri izlemek için Debian'da kullandığım şey:

/etc/rc.local:


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

/ Home / <kullanıcı adı> / 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

Bu, bir dosya ve / veya dizin listesi ve karşılık gelen inotifywait işlemlerini beklemek ve her bir inotifywait dosyasını bir dosya değiştikçe yeniden başlatmak için genelleştirilebilir .


8
Lester, lütfen bunu bir dizine nasıl genelleştireceğinizi genişletebilir misiniz?
Diego

29

Bu iş için inotifywait öneren önceki cevaplar , kendim bu sorunu yaşadığımda beni doğru yönde uçurdu , bu yüzden küçük bir senaryo yazdım. Öncelikle bu sadece tüm klasörleri özyinelemeli olarak izleyebilir (Lester Buck örneğinin tersi), ancak daha sonra başka bir yerde bir dosya izlemek istedim, bu yüzden genişlettim.

Sonuç şu anda şu an denilen bir komut dosyasıdırgitwatch : yaptığı gibi: bir dosyayı veya klasörü değişiklikleri (inotifywait kullanarak) izler ve bir git deposuna aktarır.

Senaryo, daha fazla bilgi ve talimatları github'da bulabilirsiniz: https://github.com/nevik/gitwatch


4
orada yararlı küçük komut dosyası. Bunu not edeceğim.
Iwein

ilginç magento siteleri için yararlı olabilir. Ben test ediyorum ama otomatik olarak da itmek için görünmüyor
NoSixties

16

git-wip benim için iyi çalışan harika bir çözüm. "WIP", "devam eden çalışma" anlamına gelir. 'Git wip' komutunu her çalıştırdığınızda, değişiklikler ayrı bir dalda yapılır. Komut satırında çalıştırılabilir, ancak vim ve emac'lerin her dosya yazıldığında git-wip'i otomatik olarak çalıştıracak uzantılar vardır.


12

Bunu pencerelerde yapmak istedim ve en iyi yolu değişiklikleri izlemek için Dizin İzleyicisi'ni kullanmak olduğunu öğrendim, o zaman bir değişiklik algıladı:

Program: cmd.exe

Parametreler: /CC:\yolToBatchFile.bat

Bu toplu iş dosyası şunları içeriyordu:

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"
))

Ayrıca dosya ( "%PROGRAMFILES(X86)%\git\bin\sh.exe" --login -i -c "git add *.*") eklemek için başka bir komut var denedim , ama ben düzgün çalışıyorum var sanmıyorum.

Ayrıca aşağıdakileri içeren bir taahhüt sonrası kanca yaptım:

#!/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

(Herhangi bir çatışma olsaydı, çekmeyi iptal eder ve itmeyi iptal ederdi, ancak bunun olduğunu söylemenin açık bir yolu yoktu - sonunda bu tek kusur nedeniyle tüm fikri terk ettik.)

Bu kıvırma komutu sunucuma kodu çekmesi gerektiğini söyledi. Php işlemek için gereken tek şey:

<?
$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";
}
?>

Tek sorun apache kullanıcı yerine kök kullanıcı tarafından çalıştırılması gerekiyordu, bu yüzden de /etc/sudoers.d/içeren bir dosya yapmak zorunda kaldı :

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

Benim için, bu oldukça sağlam çalıştı. Directory Monitor başlangıçta çalışacak ve simge durumuna küçültülecek şekilde yapılandırılabilir ve birkaç farklı klasörü izleyebilir


Ayrıca Windows'ta git'in LocalSystem altında çalışmasını sağlayamıyorum, bu nedenle kendi izleme hizmetinizi oluşturursanız, hizmeti gerçekten Git çalıştırabilecek bir kullanıcı altında çalıştırmanız gerekir. Muhtemelen bazı ayarları / yapılandırmaları kaçırıyorum, ancak yine de yeni bir git
kesin

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

geçerli tarih ve saatle otomatik çalma.


8

Inotify gerçekten iş için doğru araç gibi geliyor.

Tam olarak aradığınız şey olabilecek incron adı verilen bir araç var . Bir crontab gibi bir şeyde dosya veya klasörleri (ve "değiştir", "oluştur", "bağlantıyı kaldır" gibi olay türlerini ve böyle bir olay meydana geldiğinde çalıştırılacak bir komut belirtebilirsiniz.

Inotifywait'in (fakir adamın cronunun analogu olacak) aksine sleep 10;do stuff, bu sadece ilk olayı değil, her olayı yakalayacaktır.

Kendim kullanmadım, ancak belgelerden kurulum için çok karmaşık görünmüyor.


7

Bir program yazdım, Yerel Git depolarınıza otomatik kaydetme sağlamak için GitPrime . Şimdi yakalanmadan önce geri almak kolaydır! Bitbucket deposu .

Bu, Windows + Cygwin dahil olmak üzere bir bash kabuğunu destekleyen herhangi bir platformda çalışmalıdır.


+1 Değişiklikleri otomatik kaydetmek için bunu pencerelerde (CygWin) kullanıyorum Zamanlanmış bir görev kullanarak her 10 dakikada bir git-tf deposuna
yapıyorum

6

Herkes Powershell bunu yapmaya çalışırsa ben aşağıdakileri kullanarak başarılı oldu:

& "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
Ve bu otomatik olarak nasıl tetiklenir?
jerik

2
Planli gorev?
ozzy432836


2

Dosyanın adını biliyorsanız ve yalnızca bir tanesini (veya birkaç dosyayı) izlemek istiyorsanız, bunu başarmak için birkaç dakikada bir "git commit" diyebilirsiniz. Dosya değişmediyse, git sadece şikayet edecek ve bu hatayı yok saymanız gerekecek, ancak bunun dışında herhangi bir bozulma olmayacak.

Buna ek olarak, manuel olarak da işleyebilmek için bu dosyaları "otomatik kaydetme" olarak işaretlemek istersiniz. Bu şekilde, kullanıcı otomatik değişiklikleri ve aynı zamanda daha büyük "mantıksal" değişiklikleri görebilir.

Örneğin, tamamlama mesajı olarak "AUTOCOMMIT" kullanın. Daha sonra git logunu (öldürmek için revizyonları bulmak için) kullanarak bu taahhütleri temizlemek için bir araç yazabilir veya "manuel taahhütleri" çekiçlemek için kaba kuvvet çarpışma çözümleme stratejisi kullanarak bir şube AUTOCOMMIT oluşturmayı deneyebilirsiniz.

Başka bir seçenek de kendi özel havuzunuzu oluşturmak için git düşük düzeyli komutları kullanmaktır.

Son olarak, manuel ve otomatik sürümleri birbirinden ayırmak için otomatik taahhütler uygularken dosyayı yeni bir isme ("$ filename.ac") kopyalayabilirsiniz.


1

Bunu, kullanıcılarınızın kullandığı düzenleyiciye bağlamanız gerekeceğinden eminim. Değişiklikler için ankete bir şeyler yazabilirsiniz, ancak kullanım şekillerine bağlı olarak, çoklu değişiklik yerine bireysel değişiklikleri aldığından emin olmak için yoklama sıklığının inanılmaz derecede yüksek olması gerekebilir.


Ayrıca, değişikliklerin oylanması yarış koşulları yaratacaktır.
Bombe

1
Bir çökme sonrasında verilerin kaybolmamasını sağlamak için dosyaları "işlemsel olarak" yazan emacs ve yi gibi editörlerle değil.
Robin Green

1

Etki görevlisine benzer bir şey aradığınız anlaşılıyor , bu da / etc / * için tüm şansınızı (veya istediğiniz otomatik olarak kontrol etmek için tasarlanmıştır, ancak dosyalarla birlikte kullanılmaması için hiçbir neden görmüyorum / etcdekiler dışında.

Sadece tek bir dosyayla uğraşmak istiyorsanız, belki de bu mükemmel olmaz, ancak belirli bir dizindeki her şeyi takip etmek istiyorsanız, kontrol etmeye değer.


1

Bu komut dosyası bir kullanıcı dosyayı değiştirdiğinde çalışmaz, ancak bir cron işi olarak da (bir /etc/cron.* dizinine bırakarak) çalıştırılabilir ve bu da makul bir çözümdür.

Bu komut dosyası, / srv / www dizininiz üzerinden yinelenir (tüm sitelerinizin depolandığı yere değiştirin), tüm dosyaları ekler, taahhüt eder ve aktarır ve her şeyi /var/log/gitlog.txt olarak kaydeder

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

Ben de aynı sorunu vardı ve mac launchd size harika bir çözüm sunuyor. bir dosyayı veya dizini izleyecek ve değişiklikler varsa bir uygulamayı veya başka bir şeyi çalıştırabilirsiniz ...


Buraya "Bir dizini izleme" konusuna bakın: developer.apple.com/library/mac/#documentation/MacOSX/…
Kris


0

Bu, sorunun "İdeal" kısmını karşılamıyor, ancak bu istediğim cevaba en yakın soru oldu, bu yüzden buraya gidebileceğini düşündüm. Benim ilk stackoverflow yazı olsa da, eğer özür dilerim özür dilerim.

Aşağıdaki komut dosyası kaydedilen değişikliklerle otomatik kaydedilmesini sağlar, ancak does girdi taahhüt kullanıcıdan istemi. (Senaryomun git-noob'lardan biraz farklı olduğunun farkındayım).


# 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

Pencereler için

Otomatik tamamlama ile ilgili bu makaleye göre .bat, içeriğe sahip bir dosya oluşturmalısınız :

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

ve ile çalıştırın Task Scheduler. Adım adım nasıl yapacağınızı bilmiyorsanız bu makaleye bakın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.