গিট অটো-কমিট করা


154

আমি কোনও ফাইলের সমস্ত পরিবর্তন রেকর্ড করতে গিট ব্যবহার করতে চাই।

প্রতিবার একটি ফাইল আপডেট হওয়ার পরে আমি স্বয়ংক্রিয়ভাবে ঘটতে গিট 'কমিট' চালু করতে পারি - তাই কোনও ফাইলের প্রতিটি পরিবর্তনের জন্য একটি নতুন প্রতিশ্রুতি আছে?

আদর্শভাবে আমি চাই যে আমার ব্যবহারকারীরা এমনকি নাও জানেন যে গিটটি পর্দার আড়ালে চলেছে। এর পরে কোনও ব্যবহারকারী কোনও ফাইলের পরিবর্তনগুলিকে "পূর্বাবস্থায় ফিরিয়ে আনতে" পারে - এবং এটি পূর্ববর্তী সংস্করণটি গিটের বাইরে টেনে আনা সম্ভব।



1
স্পার্কলশেয়ার এতে মোটামুটি চিত্তাকর্ষক ছিল।
থিয়োড

SparkleShare একটি দুর্দান্ত বিকল্প মনে হচ্ছে কিন্তু এটা মূল Git ভিতরে কোন .git ফোল্ডারের ধ্বংস
insign

আপনি github.com/jw0k/gwatch ব্যবহার করতে পারেন । এটি উইন্ডোজ এবং লিনাক্সে কাজ করে।
রুবিক্স_আডিক্ট

@ রবিক্স_ডিক্টিক্ট আপনি উত্তর হিসাবে পোস্ট করেন নি কেন?
টোবিয়াস কেইনজলার

উত্তর:


127

লিনাক্সে আপনি যখনই কোনও ফাইলের বিষয়বস্তু পরিবর্তন করা হয় তখন স্বয়ংক্রিয়ভাবে একটি কমান্ড কার্যকর করতে ইনোটিফয়েট ব্যবহার করতে পারেন ।

সম্পাদনা করুন: নিচের কমান্ডটি ফাইলটি সংরক্ষণ করার সাথে সাথেই এটি প্রতিশ্রুতিবদ্ধ:

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 স্পষ্টতই ফাইলগুলি আইনের মাধ্যমে অনুসরণ করে, নাম নয়। এছাড়াও, ফাইলটি পরিবর্তনের পরে, এটি গিট অ্যাড বা গিট কমিট -a ব্যতীত গিট কমিটের জন্য মঞ্চস্থ হয় না । কিছু সামঞ্জস্য করা, আমি এখানে আমার ক্যালেন্ডার ফাইলে সমস্ত পরিবর্তনগুলি ট্র্যাক করতে ডিবিয়ান ব্যবহার করছি:

/etc/rc.local:


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

/ হোম / <ব্যবহারকারী নাম> / বিন / 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

এটি ফাইল এবং / অথবা ডিরেক্টরিগুলির তালিকা এবং সংশ্লিষ্ট ইনোটিফয়েট প্রক্রিয়াগুলির জন্য অপেক্ষার জন্য সাধারণ করা যেতে পারে এবং ফাইল পরিবর্তন হওয়ার সাথে সাথে প্রতিটি ইনোটিফয়েট পুনরায় চালু করতে পারে ।


8
লেস্টার আপনি কীভাবে এটি কোনও ডিরেক্টরিতে সাধারণীকরণ করবেন দয়া করে প্রসারিত করতে পারেন?
দিয়েগো

29

পূর্ববর্তী উত্তরগুলি এই কাজের জন্য ইনোটিফাইয়েটের প্রস্তাব দিচ্ছে যখন আমার নিজের এই সমস্যাটি হয়েছিল তখন সঠিক দিক থেকে আমাকে সরিয়ে দিয়েছিল, তাই আমি একটি ছোট স্ক্রিপ্ট লিখেছিলাম। প্রথমে এটি কেবল পুরো ফোল্ডারগুলি পুনরাবৃত্তভাবে দেখতে পেত (লেস্টার বাকের উদাহরণের বিপরীতে), তবে তারপরে আমি অন্য কোথাও একটি ফাইলও দেখতে চেয়েছি, তাই আমি এটি প্রসারিত করেছি।

ফলাফলটি বর্তমানে একটি স্ক্রিপ্টgitwatch হিসাবে পরিচিত , যা এটি এটি করে: এটি পরিবর্তনের জন্য কোনও ফাইল বা ফোল্ডার দেখায় (ইনোটিফয়েট ব্যবহার করে) এবং গিট সংগ্রহস্থলে তাদের প্রতিশ্রুতি দেয়।

আপনি স্ক্রিপ্ট, আরও তথ্য এবং নির্দেশাবলী গিথুব থেকে খুঁজে পেতে পারেন: https://github.com/nevik/gitwatch


4
সেখানে দরকারী ছোট স্ক্রিপ্ট। আমি এটি একটি নোট তৈরি করব।

আকর্ষণীয় ম্যাজেন্টো সাইটের জন্য দরকারী হতে পারে। আমি এটি পরীক্ষা করছি তবে মনে হচ্ছে না এটি স্বয়ংক্রিয়ভাবে ধাক্কা দেবে
NoSixties

16

গিট-ওয়াইপ একটি দুর্দান্ত সমাধান যা আমার পক্ষে ভালভাবে কাজ করে। "ডাব্লুআইপি" বলতে "কাজ চলছে"। যতবার আপনি 'গিট উইপ' চালান, ততক্ষণে পরিবর্তনগুলি পৃথক শাখায় নিয়ে যাওয়া হয়। এটি কমান্ড লাইনে চালানো যেতে পারে, তবে প্রতিবার একটি ফাইল লেখার সময় গিট-উইপ স্বয়ংক্রিয়ভাবে চালানোর জন্য ভিআইএম এবং ইমাসের জন্য এক্সটেনশন রয়েছে।


12

আমি এটি উইন্ডোতে করতে চেয়েছিলাম, এবং সবচেয়ে ভাল উপায়টি ছিল অনুসন্ধানের জন্য ডাইরেক্টরি মনিটরটি ব্যবহারের পরে পরিবর্তনগুলি পরীক্ষা করার পরে যখন এটি পরিবর্তনটি সনাক্ত করে এটি চালু হয়:

প্রোগ্রাম: cmd.exe

প্যারামগুলি: / সিসি: প্যাথটোব্যাচফিল.বাট

ব্যাচের ফাইলটি এতে রয়েছে:

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

(যদি কোনও বিবাদ হয় তবে তা টান বাতিল করতে হবে এবং ধাক্কাটি বাতিল করতে হবে, তবে ঘটেছে তা বলার কোনও সুস্পষ্ট উপায় ছিল না - শেষ পর্যন্ত আমরা এই একটি ত্রুটির কারণে পুরো ধারণাটি ত্যাগ করেছি))

এই কার্ল কমান্ডটি আমার সার্ভারকে জানিয়েছে যে কোডটিতে একটি টান দেওয়া দরকার। এটি পিএইচপি-তে হ্যান্ডেল করার জন্য যা যা প্রয়োজন তা হ'ল:

<?
$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

আমার জন্য, আমি মনে করি এটি বেশ দৃly়ভাবে কাজ করেছে। ডিরেক্টরি মনিটরটি স্টার্টআপে চালনা ও কমানোর জন্য কনফিগার করা যায় এবং এটি বেশ কয়েকটি বিভিন্ন ফোল্ডার দেখতে পারে


উইন্ডোজেও, আমি লোকালসিস্টেমের অধীনে চালনার জন্য গিট পেতে পারি না, সুতরাং আপনি যদি নিজের নিজস্ব তদারকি পরিষেবা তৈরি করেন তবে আপনাকে এটি এমন কোনও ব্যবহারকারীর অধীনে চালাতে হবে যা গিটটি চালাতে পারে। সম্ভবত আমি কিছু সেটিংস /
কনফিগারটি


8

Inotify সত্যিই কাজের জন্য সঠিক সরঞ্জাম মত শোনাচ্ছে।

ইনক্রন নামে একটি সরঞ্জাম রয়েছে যা আপনি যা খুঁজছেন ঠিক তেমনই হতে পারে। আপনি ফাইল বা ফোল্ডারগুলি (এবং ইভেন্টের ধরণগুলি, যেমন "পরিবর্তন", "তৈরি", "লিঙ্কমুক্ত") কোনও ক্রন্টবটের মতো কোনও কিছুতে এবং যেমন কোনও ঘটনা ঘটতে পারে তখন চালানোর জন্য একটি আদেশ নির্দিষ্ট করতে পারেন।

ইনোটিফাইয়েটের বিপরীতে (যা দরিদ্র মানুষের ক্রোনার এনালগ sleep 10;do stuffহবে), এটি প্রথমটি নয়, প্রতিটি ইভেন্টকেই ধরবে।

আমি নিজে এটি ব্যবহার করি নি, তবে ডকুমেন্টেশন থেকে এটি সেটআপ করা খুব জটিল বলে মনে হচ্ছে না।


7

আপনার স্থানীয় গিট সংগ্রহস্থলগুলির জন্য অটোসোভ সরবরাহ করতে আমি গিটপ্রিম একটি প্রোগ্রাম লিখেছিলাম । এটি বিস্ফোরিত করার আগে এখন আবার রোল করা সহজ! বিটবকেট সংগ্রহস্থল

এটি উইন্ডোজ + সিগউইন সহ কোনও ব্যাশ শেল সমর্থন করে এমন কোনও প্ল্যাটফর্মে কাজ করা উচিত।


+1 আমি নির্ধারিত টাস্কটি ব্যবহার করে প্রতি 10 মিনিটে একটি গিট-টিএফ সংগ্রহস্থলটিতে স্বয়ংক্রিয় সংরক্ষণের জন্য উইন্ডোজে (সাইগউইন) এটি ব্যবহার করছি
দার্বিও

6

যদি কেউ পাওয়ারশেল থেকে এটি করার চেষ্টা করে তবে আমি নিম্নলিখিতটি ব্যবহার করে সাফল্য পেয়েছি:

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

4

আমি পছন্দ করি এমন দুটি সমাধান হ'ল অ্যাডকিপার - যা কাস্টম ডিরেক্টরি ছাড়া অন্য কোনও কাস্টম ডিরেক্টরিতে অভিযোজিত হতে পারে/etc :

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

এবং গিটওয়াচ - এটি কীভাবে ব্যবহার করবেন সে সম্পর্কেsupervisord বিশেষভাবে নির্দেশাবলী ।


2

যদি আপনি ফাইলটির নাম জানেন এবং আপনি কেবলমাত্র একটি (বা কয়েকটি ফাইল) নিরীক্ষণ করতে চান তবে এটি অর্জনের জন্য আপনি প্রতি কয়েক মিনিটে "গিট কমিট" কল করতে পারেন। যদি ফাইলটি না পরিবর্তিত হয়, গিটটি কেবল অভিযোগ করবে এবং আপনাকে এই ত্রুটিটি উপেক্ষা করতে হবে তবে এগুলি ছাড়া কোনও দুর্নীতি হবে না।

এগুলি ছাড়াও, আপনি নিজে নিজেও প্রতিশ্রুতিবদ্ধ করতে সক্ষম হতে এই ফাইলগুলিকে "অটো কমিট" হিসাবে চিহ্নিত করতে চাইবেন। এইভাবে, ব্যবহারকারী স্বয়ংক্রিয় পরিবর্তনগুলি এবং বড় আকারের "যৌক্তিক" পরিবর্তনগুলিও দেখতে পারে যা শেষ ম্যানুয়াল কমিটের পরে পরিবর্তিত হয়েছে তা ব্যাখ্যা করার জন্য কমিট কমেন্টের সাথে রয়েছে।

উদাহরণস্বরূপ, প্রতিশ্রুতি বার্তা হিসাবে "আউটকোমিট" ব্যবহার করুন। পরে, আপনি গিট লগ (হত্যাটি সংশোধনগুলি জানতে) ব্যবহার করে এই কমিটগুলি শুদ্ধ করার জন্য একটি সরঞ্জাম লিখতে পারেন বা "ম্যানুয়াল কমিটস" এ হাতুড়ি করার জন্য একটি ব্রুট ফোর্স সংঘর্ষের সমাধান কৌশল ব্যবহার করে একটি শাখা অটোকোমিট তৈরির চেষ্টা করতে পারেন।

অন্য বিকল্পটি হ'ল গিট নিম্ন-স্তরের কমান্ডগুলি আপনার নিজস্ব বিশেষায়িত সংগ্রহশালা তৈরি করতে ব্যবহার করা।

সর্বশেষে, অটো ম্যানুয়াল এবং স্বয়ংক্রিয় সংস্করণগুলির মধ্যে পার্থক্য করার জন্য অটো কমিট করার সময় আপনি কোনও নতুন নাম ("name filename.ac") এ ফাইলটি অনুলিপি করতে পারবেন।


1

আমি নিশ্চিত যে আপনার ব্যবহারকারীরা যে সম্পাদককে ব্যবহার করছেন এটির মধ্যে আপনাকে হুক করা দরকার। আপনি পরিবর্তনের জন্য জরিপে কিছু লিখতে পারেন, তবে ব্যবহারের ধরণগুলির উপর নির্ভর করে, একাধিক পরিবর্তনের পরিবর্তে পৃথক পরিবর্তনগুলি গ্রহণ করছিল তা নিশ্চিত করার জন্য ভোটদানের ফ্রিকোয়েন্সিটি অবিশ্বাস্যভাবে বেশি হতে পারে।


এছাড়াও, পরিবর্তনের জন্য পোলিং জাতিদের পরিস্থিতি তৈরি করবে।
বোম্বে

1
ইমাসস এবং ইয়ের মতো সম্পাদকদের সাথে নয়, যা ক্রাশের পরে ডেটা নষ্ট হবে না তা নিশ্চিত করার চেষ্টা করার জন্য ফাইলগুলি "লেনদেনভাবে" লেখেন।
রবিন সবুজ

1

দেখে মনে হচ্ছে আপনি ইত্যাদি সম্পর্কিত কিছু সন্ধান করছেন , যা আপনার সমস্ত পরিবর্তনটি / etc / * গিটে স্বয়ংক্রিয়ভাবে পরীক্ষা করার জন্য ডিজাইন করা হয়েছে (বা যা কিছু ভিসিএস আপনি চান) তবে আমি কোনও কারণ দেখতে পাচ্ছি না এটি ফাইলের সাথে ব্যবহার করা যায়নি / ইত্যাদি মধ্যে ছাড়া অন্য।

আপনি যদি কেবলমাত্র একটি একক ফাইলের সাথে ডিল করতে চান তবে এটি নিখুঁত হবে না তবে আপনি যদি কোনও প্রদত্ত ডিরেক্টরিতে সমস্ত কিছু ট্র্যাক রাখতে চান তবে আমার মনে হয় এটি পরীক্ষা করা ভাল।


1

কোনও ব্যবহারকারী ফাইল পরিবর্তন করলে এই স্ক্রিপ্টটি চলবে না, তবে এটি ক্রোন জব হিসাবে চালানো যেতে পারে (একে /etc/cron.* ডিরেক্টরিতে ফেলে দিয়ে), এটিও একটি যুক্তিসঙ্গত সমাধান।

এই স্ক্রিপ্টটি আপনার / এসআরভি / 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

আমার একই সমস্যা ছিল এবং ম্যাক লঞ্চ করা আপনাকে একটি দুর্দান্ত সমাধান সরবরাহ করে। এটি কোনও ফাইল বা ডিরেক্টরি দেখবে এবং যদি পরিবর্তন হয় তবে আপনি একটি অ্যাপ্লিকেশন বা অন্য কিছু চালাতে পারেন ...


এখানে "একটি ডিরেক্টরি নিরীক্ষণ" দেখুন: বিকাশকারী
অ্যাপ্লিকেশন /

0

ফাইলের স্থিতি এবং ট্রিগার কমান্ড যেমন গিট কমিট সাফল্যের বিষয়ে কমিট করার জন্য আমি এই ক্ষুদ্র শেল স্ক্রিপ্ট তৈরি করেছি।

এটি নির্দ্বিধায় ডাউনলোড করে দেখুন।

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


0

এটি প্রশ্নের "আদর্শভাবে" অংশটি সন্তুষ্ট করে না, তবে এটি আমার কাছে যে উত্তরটি চেয়েছিল তার কাছে দেখা সবচেয়ে কাছের প্রশ্ন, তাই আমি বুঝতে পেরেছিলাম যে এটি এখানে যেতে পারে। যদিও আমার প্রথম স্ট্যাকওভারফ্লো পোস্ট, তাই যদি আমি ভুল করে থাকি তবে ক্ষমাপ্রার্থী।

নিম্নলিখিত স্ক্রিপ্ট সংরক্ষিত পরিবর্তনগুলির স্বয়ংক্রিয় করে নিশ্চিত করে, কিন্তু আছে প্রম্পট ইনপুট কমিট জন্য ব্যবহারকারীকে। (আমি বুঝতে পারি আমার পরিস্থিতি গিট-নুব-এর চেয়ে কিছুটা আলাদা)।


# 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। আপনি যদি পদক্ষেপ-পদক্ষেপ কীভাবে করতে না জানেন তবে অনুচ্ছেদটি পড়ুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.