ফাইল পরিবর্তনের পরে স্বয়ংক্রিয় সংস্করণ (পরিবর্তন / তৈরি / মুছুন)


16

আমি এমন একটি প্রক্রিয়া প্রয়োগের (লিনাক্সে) সন্ধান করছি যা স্বয়ংক্রিয়ভাবে এবং স্বচ্ছভাবে কোনও ডিরেক্টরিতে পরিবর্তন (পুনরাবৃত্ত) সংস্করণ করে। মানক সংস্করণ (এসভিএন, গিট, ...) এ এটি সংযোজন (সম্ভবত সমস্ত অনুরোধিত বৈশিষ্ট্য উপলব্ধ থাকলে প্রতিস্থাপন) করার উদ্দেশ্যে করা হয়েছে

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

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

কিছু কাজ করছেন inotify?

কোনও পয়েন্টারের জন্য আগাম ধন্যবাদ! WoJ




আপনি কোন সফটওয়্যারটি ব্যবহার করেন সে সম্পর্কে কি বিশেষ প্রয়োজন আছে? কারণ আপনি যদি কেবলমাত্র ম্যানুয়ালি করে (ফাইলগুলি সম্পাদনা করে) যে পরিবর্তনগুলি অনুসরণ করেন তা যদি সন্ধান করে থাকেন, তবে গ্রহগ্রহের অভ্যন্তরীণ বৈশিষ্ট্যটি বিল্ট-ইন রয়েছে, একে "স্থানীয় ইতিহাস" বলা হয়।
স্টিফান সিডেল

পছন্দ করেছেন
মাইকেল পানকভ

উত্তর:


6

1. বাজার এবং inotify ব্যবহার করে সাধারণ উদ্দেশ্য পদ্ধতি

এটি আমার দ্বারা অপরীক্ষিত কিন্তু আমি দেখেছি এই লেখার আপ করে নির্মিত হয় ব্যবহার bzr(Bazaar) &inotifywait ডিরেক্টরি ব্যবহার করে কোনও ডিরেক্টরি এবং সংস্করণে ফাইলগুলি নিয়ন্ত্রণ করে monitor

এই স্ক্রিপ্টটি পরিবর্তনের জন্য ডিরেক্টরি দেখার সমস্ত কাজ করে:

#!/bin/bash

# go to checkout repository folder you want to watch
cd path/to/www/parent/www
# start watching the directory for changes recusively, ignoring .bzr dir
# comment is made out of dir/filename
# no output is shown from this, but wrinting a filename instead of /dev/null 
# would allow logging
inotifywait –exclude \.bzr -r -q -m -e CLOSE_WRITE \
    –format=”bzr commit -m ‘autocommit for %w/%f’” ./ | \
    sh  2>/dev/null 1>&2 &
# disown the pid, so the inotify thread will get free from parent process
# and will not be terminated with it
PID=`ps aux | grep inotify | grep CLOSE_WRITE | grep -v grep | awk ‘{print $2}’`
disown $PID

# this is for new files, not modifications, optional
inotifywait –exclude \.bzr -r -q -m -e CREATE \
    –format=”bzr add *; bzr commit -m ‘new file added %w/%f’” ./ | \
    sh  2>/dev/null 1>&2 &
PID=`ps aux | grep inotify | grep CREATE | grep -v grep | awk ‘{print $2}’`
disown $PID

exit 0;

2. পরিচালনা / ইত্যাদি

আপনার সিস্টেমের /etcডিরেক্টরি পরিচালনা করার বিশেষ ক্ষেত্রে আপনি অ্যাপ্লিকেশন ইত্যাদি ব্যবহার করতে পারেন ।

এডিকিপার হ'ল গিট, পারদর্শী, ডার্কস, বা বিজেআর রিপোজিটরিতে সংরক্ষণ করার জন্য সরঞ্জামগুলির সংকলন। প্যাকেজ আপগ্রেডের সময় / ইত্যাদিতে স্বয়ংক্রিয়ভাবে পরিবর্তনগুলি সম্পাদন করতে এটি (এবং অন্যান্য প্যাকেজ ম্যানেজারগুলি ইয়াম এবং প্যাকম্যান-জি 2 সহ) অনুসন্ধান করে। এটি ফাইলের মেটাডেটা ট্র্যাক করে যা পুনর্বিবেচনা নিয়ন্ত্রণ ব্যবস্থা সাধারণত সমর্থন করে না, তবে এটি / ইত্যাদির জন্য যেমন / ইত্যাদি / ছায়ার অনুমতি হিসাবে গুরুত্বপূর্ণ। এটি বেশ মডিউলার এবং কনফিগারযোগ্য, আপনি যদি সংশোধন নিয়ন্ত্রণের সাথে কাজ করার বেসিকগুলি বুঝতে পারেন তবে এটি ব্যবহার করা সহজ।

এটির সাথে শুরু করার জন্য এখানে একটি দুর্দান্ত টিউটোরিয়াল

৩. গিট এবং ইনক্রন ব্যবহার করা

এই কৌশলটি ব্যবহার করে gitএবং incron। এই পদ্ধতির জন্য আপনাকে নিম্নলিখিতগুলি করতে হবে:

উঃ একটি রেপো তৈরি করুন

% mkdir $HOME/git
% cd $HOME/git
% git init

বি। একটি $HOME/bin/git-autocommitস্ক্রিপ্ট তৈরি করুন

#!/bin/bash

REP_DIR="$HOME/git"       # repository directory
NOTIFY_DIR="$HOME/srv"    # directory to version

cd $REP_DIR
GIT_WORK_TREE=$NOTIFY_DIR /usr/bin/git add .
GIT_WORK_TREE=$NOTIFY_DIR /usr/bin/git commit -a -m "auto"

গ। অন্তর্ভুক্তে একটি এন্ট্রি যুক্ত করুন

% sudo incrontab -e $HOME/srv IN_MODIFY,IN_CREATE,IN_MOVED_FROM,IN_MOVED_TO $HOME/bin/git-autocommit

৪. ফ্ল্যাশবেক ব্যবহার করা

আরেকটি বিকল্প হ'ল ফ্ল্যাশবেকের মতো একটি সরঞ্জাম ব্যবহার করা । ফ্ল্যাশবেক হ'ল সংস্করণ নিয়ন্ত্রণ ব্যবস্থা যা কোরি ডক্টরও (বোয়িংবিং খ্যাতির) তাঁর বইগুলি লেখার জন্য ব্যবহার করেন।

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

কোরি এই সংস্করণটি প্রম্পটগুলি বহন করতে চেয়েছিল, একটি স্বয়ংক্রিয় প্রতিশ্রুতি সংঘটিত হওয়ার সময় তিনি কোথায় ছিলেন এবং কী ভাবছিলেন সে সম্পর্কে স্ন্যাপশট। তিনি যে প্রাসঙ্গিক তথ্যটি চেয়েছিলেন তা জানতে আমি পাইথন স্ক্রিপ্টটি খুব দ্রুত স্কেচ করেছিলাম এবং গিট ড্রাইভের জন্য শেল স্ক্রিপ্ট একসাথে হ্যাক করা শুরু করি, যখন ক্রোন জব শেল র‌্যাপারে ডাক দেয় তখন কমিট কমেন্টের জন্য পাইথন স্ক্রিপ্টের আউটপুট ব্যবহার করে।

সম্পদ


3
inotifywait + "গিট লোকাল" = গিটওয়াচ.শ, এখানে দেখুন: github.com/nevik/gitwatch/blob/master/gitwatch.sh
ডায়িমেজ

4

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


আমি জেডএফএস সম্পর্কে পড়েছি তবে দেখে মনে হচ্ছে এটি বেসিক ফাইল
সিস্টেমগুলির

আমি বিদ্যমান এফএসে স্ন্যাপ করার সত্যিই একটি সমাধান চাই।
মাইকেল পানকভ

সম্ভবত এই? ext3CO.com
জ্যাক বি

3

আমি মনে করি আপনি সঠিক পথে আছেন inotifyএই নিবন্ধটি আপনার অনুরূপ ক্ষেত্রে এর মৌলিক ব্যবহারের বিশদ বর্ণনা করে। আমি এটি সরাসরি ব্যবহার করার পরামর্শ দিচ্ছি, বা fschange এর মতো কার্নেল-স্তরের ইউটিলিটি সংকলন করব । এটি কোনও ঝামেলার বিষয়, তবে আপনি তারপরে কোনও git commitবা এর মতো পরিবর্তনগুলির সনাক্তকরণ বাঁধতে পারেন ।

এই সমাধানগুলির উভয়েরই কিছুটা অসম্পূর্ণ তৃতীয় পক্ষের সমাধানগুলির উপর নির্ভর করার বিষয়টি রয়েছে। আপনি আপনার হাত ময়লা পেয়ে কিছু মনে না করেন, NodeJS একটি চমৎকার, ক্রস-প্ল্যাটফর্ম ফেসিলিটি (উপলব্ধ fs.watch ঠিক এই উদ্দেশ্যে)। নোডজেএস-এ পরিবর্তনের জন্য ফাইলগুলি দেখার জন্য একটি প্রাথমিক টিউটোরিয়ালটি এখানে পাওয়া যাবে । কয়েক ডজন লাইন বা তারও কম ক্ষেত্রে, আপনি এমন কিছু লিখতে পারেন যা ফাইলগুলির জন্য ডিরেক্টরি দেখায় এবং তারপরে শেল আউট করে ( চাইল্ড_প্রসেসের মাধ্যমে ) চালায় এবং একটিরgit commit অনুরূপ (বা এমনকি ম্যানুয়ালি একটি সংস্করণ ফাইল সূচককে বাড়িয়ে দেয় , যদি আপনি রোলটি আপনার পছন্দ করেন) নিজস্ব পদ্ধতির)।

fs.watchinotifyলিনাক্স দ্বারা সমর্থিত , তবে এটি ব্যবহার করার জন্য অনেক বেশি স্বজ্ঞাত। এমন আরও নোডজেএস প্রকল্প রয়েছে যা বিভিন্ন ফাইলের সুবিধায় এই ফাইল-দেখার কার্যকারিতা গুটিয়ে রাখে যেমন এই বা একটির মতো


এখনও প্রস্তুত সমাধান নয়, এবং ভাল, আমি সম্ভবত পাইথনের সাথে যাব inotify। কিন্তু ধন্যবাদ.
মাইকেল পানকভ

3

লিনাক্স-এ ইনোটিফাই (2) কোনও বৃহত গাছ দেখতে পাবে না, তবে ফিউজ ফাইল সিস্টেম (পৃথক স্থানে মাউন্ট করা) সম্ভবত এটি পরিচালনা করতে পারে, এসএনএন বা গিট কলগুলিতে ফাইল সিস্টেমের অনুরোধগুলি অনুবাদ করে অথবা সরাসরি এসএনএন / গিট মেটাডেটা পরিবর্তন করে।

এটি একটি খুব আকর্ষণীয় ধারণা, তবে আমি কোনও বিদ্যমান বাস্তবায়ন সম্পর্কে শুনিনি।


ধরা যাক আমার কাছে কেবল দুটি ফাইল রয়েছে।
মাইকেল পানকভ

0

এ জাতীয় স্ক্রিপ্ট লেখা শক্ত নয়।

আমার প্রিয় সংস্করণ নিয়ন্ত্রণ গিট।

নিম্নলিখিত স্ক্রিপ্ট এটি করা উচিত:

#!/bin/sh
git add .
git commit -am "my automatic commit"

হয় সেগুলি পর্যায়ক্রমে আপনার ডিরেক্টরিটি পরীক্ষা করে দেখুন - বা যদি আপনার সম্পাদক সংরক্ষণের পরে স্ক্রিপ্টযোগ্য কল হয়।

তবে আপনি যদি এটি এটি করেন তবে বড় ফাইলগুলি এবং অটোসেসের মতো কিছু "অকেজো" বর্জন করা বুদ্ধিমান হতে পারে।


হ্যাঁ আমি জানি যে ক্রোন ভিত্তিক সমাধানটি কার্যকর করা সহজ। আমি তবে এমন কিছু সন্ধান করছি যা সংরক্ষণের সংস্করণ হবে, সেভ প্রক্রিয়াটি কোনও ব্যাপার নয়। এই কারণেই আমি এসএনএন-এর উপর অটোভার্সনআইনফের পাশাপাশি আমার প্রশ্নের সন্ধানের জন্য উল্লেখ করেছি।
ওজজে

0

স্পার্কলশেয়ার ( http://sparkleshare.org ) গিটের উপর ভিত্তি করে সংস্করণ নিয়ন্ত্রণের সাথে একটি ড্রপবক্সের মতো কার্যকারিতা প্রয়োগ করে তবে আপনাকে একটি এসএস-সার্ভার সেট আপ করতে হবে (লোকালহোস্ট হতে পারে)।


এই জিনিসটি আনাড়ি এবং প্রচুর সেটআপ প্রয়োজন। তদ্ব্যতীত, ড্রপবক্স কার্যকারিতা বিনা শর্তে।
মাইকেল পানকভ


0

এখানে কেবল "আরএসএনসিএন এবং ক্রোন জব" ব্যবহার করে একটি "দরিদ্র লোক" করার উপায় রয়েছে। আপনি মূলত rsync এর ব্যাকআপ সুবিধার উপর নির্ভর করেন এবং আপনার ফাইলগুলি ট্র্যাক রাখতে দুটি পৃথক পাথ প্লাস একটি উপসর্গ / প্রত্যয় ব্যবহার করুন।

এটি আরও কম দেখায়: / usr / bin / rsync -a -A -X --backup --suffix = date +".%Y-%m-%d_%H-%M-%S"$ উত্স_পথ $ ব্যাকআপ_পথ

শেষ ফলাফল: প্রাথমিক সম্পাদনের পরে উত্স পথে test_rsync নামে একটি ফাইল পরিবর্তন করার ফলে টেস্ট_আরসিঙ্ক।

এটি নিয়ে বেশ কয়েকটি সমস্যা রয়েছে (এটি যদি আপনার কেবলমাত্র একটি শালীন পরিমাণের ফাইল থাকে তবে এটি কার্যকর হয় যদি ক্রমাগত দুটি রাইএসসিএনসি (আমার ক্ষেত্রে 1 মিনিট) এর মধ্যে ঘটে থাকে তবে এটি আপনার প্রয়োজনের জন্য পর্যাপ্ত হতে পারে।

আমরা যদি এখানে সাম্বা শেয়ারের বিষয়ে কথা বলি তবে একটি বর্জনীয় তালিকাটি যথাযথ হতে পারে, এটির কাছাকাছি না থাকলেও আমি ভীত।

আপনি যদি এটির উন্নতি করেন তবে আমাকে জানান।


0

এখানে পাইথন 3 স্ক্রিপ্ট রয়েছে যা সংরক্ষণের সময় মূল ফাইলের নামের সাথে সংযুক্ত টাইম স্ট্যাম্প ব্যবহার করে অটো ফাইলের সংস্করণকরণের মতো ভিএমএস করে।

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

! / usr / bin / env পাইথন 3

মুদ্রণ ("প্রকল্পের ফাইলগুলি সংস্করণ শুরু করা হয়েছে") মুদ্রণ ("version_creation.py") # এই নাম কোডের স্ক্রিপ্টে এই সমস্ত কোডটি স্থান দিন ("চালিত করুন .. 'python3 version_creation.py' কমান্ড লাইন থেকে") মুদ্রণ ("সিটিআরএল ' সি 'থামাতে ") মুদ্রণ (" ") মুদ্রণ (" নীচে কমান্ড লাইনের জন্য পটভূমিতে প্রোগ্রাম চালানোর জন্য উইন্ডোটি বন্ধ করুন "") মুদ্রণ ("নোহুপ পাইথন 3 সংস্করণ_ক্রিয়েশন.পি") মুদ্রণ (".... থেকে প্রক্রিয়া বন্ধ করুন মেনু / প্রশাসন / সিস্টেম মনিটর ... এবং পাইথন 3 কে হত্যা করুন ") মুদ্রণ (" ") মুদ্রণ (" সর্বদা ফাইলগুলিকে 'প্রকল্পফিলার' ডিরেক্টরিতে সংরক্ষণ করুন এবং সংস্করণ ফাইলগুলি ") মুদ্রণ (" ডিরেক্টরিতেও তৈরি করা হবে) । ") মুদ্রণ (" ") মুদ্রণ (" ") মুদ্রণ (" ") মুদ্রণ (" ")

আমদানি শুটিল আমদানি ওএস আমদানির সময়

--- নীচে নতুন ফাইল (সেকেন্ডে) পরীক্ষা করার জন্য সময় ব্যবধান নির্ধারণ করুন

- এই বিরতিটি অন্তরের চেয়ে নতুন হওয়া উচিত নতুন ফাইলগুলি প্রদর্শিত হবে!

t = 10

--- উত্স ডিরেক্টরি (dr1) এবং লক্ষ্য ডিরেক্টরি (dr2) সেট করুন

dr1 = "/ পাথ / থেকে / উত্স_নির্দেশ"

ড্র 2 = "/ পাথ / থেকে / টার্গেট_ ডিরেক্টরি"

আমদানি গ্লোব আমদানি ওএস

ড্র 1 = "/ হোম / মাইকেল / প্রজেক্টফিলস" # দুটি মূল এবং সংস্করণ এই ডিরেক্টরিতে সংরক্ষণ করা হবে

ড্র 2 = "/ হোম / মাইকেল / প্রকল্প ফাইল ফাইল"

যদিও সত্য:

if os.listdir(dr1) == []:

মুদ্রণ ("খালি")

    n = 100
else:
    list_of_files = glob.glob(dr1+'/*')   # * means all if need specific format then *.csv
    latest_file_path = max(list_of_files, key=os.path.getctime)

মুদ্রণ ("1 সর্বশেষ_ফায়াল_পাথ =", সর্বশেষ_ফাইলে_পাথ)

    originalname = latest_file_path.split('/')[-1]

মুদ্রণ ("2 মূল নাম =", মূল নাম)

    filecreation = (os.path.getmtime(latest_file_path))

মুদ্রণ ("filecreation =", ফাইলক্রিয়েশন)

    now = time.time()
    fivesec_ago = now - 5 # Number of seconds

মুদ্রণ ("পাঁচ সেক্সি_গো =", পাঁচ সেক্সি_গো)

    timedif = fivesec_ago - filecreation #time between file creation

মুদ্রণ ("সময়সীমা =", সময়সীমা)

    if timedif <= 5: #if file created less than 5 seconds ago

        nameroot = originalname.split(".")[-0]
        print ("3 nameroot= ", nameroot)

        extension = os.path.splitext(originalname)[1][1:]
        print ("4 extension = ", extension)

        curdatetime = time.strftime('%Y%m%d-%H%M%S')
        print ("5 curdatetime = ", curdatetime)

        newassembledname = (nameroot + "_" + curdatetime + "." + extension)
        print ("6 newassembledname = ", newassembledname)



        source = dr1+"/"+originalname
        print ("7 source = ", source)

        target = dr1+"/"+newassembledname
        print ("8 target = ", target)

        shutil.copy(source, target)


    time.sleep(t)

ভাগ

নীচেটি আগে রাখা হয়েছিল এবং কাজ করেছে তবে আমি উপরের পাইথন স্ক্রিপ্টটি আরও ভাল পছন্দ করি ...... (প্রায় ২ ঘন্টা অজগর ব্যবহার করে যাচ্ছি)

#!/usr/bin/env python3

print ("PROJECT FILES VERSIONING STARTED")
print ("projectfileversioning.py")
print ("run as..  'python3 projectfileversioning.py'       from command line")
print ("ctrl 'c'      to stop")
print (" ")
print ("To run program in background type below to command line and then close the window. ")
print ("nohup python3 projectfileversioning.py")
print ("....to stop process go menu/administration/system monitor... and kill python")
print (" ")
print ("Always save files to the 'ProjectFiles' directory and the file ")
print ("   will be redirected to the ProjectFileVersions where")
print ("   time stamped versions will also be created.")
print (" ")
print ("If you like you may then copy/move the versioned and original file from 'ProjectFileVersions' to ")
print ("any other directory you like.")

import shutil
import os
import time

#--- set the time interval to check for new files (in seconds) below 
#-   this interval should be smaller than the interval new files appear!
t = 10

#--- set the source directory (dr1) and target directory (dr2)
#dr1 = "/path/to/source_directory"
#dr2 = "/path/to/target_directory"

import glob
import os

dr1 = "/home/michael/ProjectFiles"
dr2 = "/home/michael/ProjectFileVersions"


while True:

    if os.listdir(dr1) == []:
        n = 100
    else:
        list_of_files = glob.glob(dr1+'/*')   # * means all if need specific format then *.csv
        latest_file_path = max(list_of_files, key=os.path.getctime)
        print ("1 Latest_file_path = ", latest_file_path)

        originalname = latest_file_path.split('/')[-1]
        print ("2 originalname = ", originalname)

        nameroot = originalname.split(".")[-0]
        print ("3 nameroot= ", nameroot)

        extension = os.path.splitext(originalname)[1][1:]
        print ("4 extension = ", extension)

        curdatetime = time.strftime('%Y%m%d-%H%M%S')
        print ("5 curdatetime = ", curdatetime)

        newassembledname = (nameroot + "_" + curdatetime + "." + extension)
        print ("6 newassembledname = ", newassembledname)




        source = dr1+"/"+originalname
        print ("7 source = ", source)

        target = dr2+"/"+originalname
        print ("8 target = ", target)

        shutil.copy(source, target)



        source = dr1+"/"+originalname
        print ("9 source = ", source)

        target = dr2+"/"+newassembledname
        print ("10 target = ", target)

        shutil.move(source, target)
        time.sleep(t)


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