নেটওয়ার্ক অ্যাক্সেস ছাড়াই একাধিক সিস্টেমে গিট ব্যবহার করা


84

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


65
আপনার শিরোনাম কোনও নেটওয়ার্ক অ্যাক্সেস বলে না, আপনার প্রশ্নে কোনও ইন্টারনেট অ্যাক্সেস নেই; একটি বিশাল পার্থক্য।
tkausl

7
@ টুটুকাইন আপনার একটি স্থানীয় নেটওয়ার্ক থাকতে পারে যা ইন্টারনেটে সংযুক্ত নয়। Github.com এর পরিবর্তে আপনি যেমন গিট সার্ভার স্থাপন করেছেন। 192.168.1.100 এবং অন্য সমস্ত কিছু একই কাজ করে।
এজেন্ট_এল

12
@ টুটুকাইন: গুরুতর প্রশ্ন হচ্ছে দুটি মেশিনের মধ্যে সরাসরি (বা অপ্রত্যক্ষ) নেটওয়ার্ক যোগাযোগ সম্ভব কিনা। সুতরাং আপনার ক্ষেত্রে, উভয় মেশিনই নেটওয়ার্কযুক্ত, তবে নেটওয়ার্কগুলি পৃথক করা হয়েছে? সেক্ষেত্রে আপনার প্রশ্নে সেই তথ্যটি সম্পাদনা করুন।
সলেস্কে

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

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

উত্তর:


157

অবশ্যই, গিট সম্পর্কে এমন কোনও কিছুই নেই যার জন্য একটি নির্দিষ্ট প্রোটোকল প্রয়োজন। বাক্সের ঠিক বাইরে স্ট্যান্ডার্ড ক্লায়েন্ট এইচটিটিপি (এস), এসএসএইচ, কাস্টম গিট প্রোটোকল এবং গুরুত্বপূর্ণভাবে স্থানীয় প্রোটোকল সমর্থন করে। এটি কেবল একটি স্থানীয় .gitডিরেক্টরিতে পাথ নেয় যা কার্যকরী ডিরেক্টরি ( /path/to/project/.git) বা কেবল একটি খালি ডিরেক্টরি ( /path/to/project.git) এর মধ্যে থাকতে পারে যদিও নামকরণটি কেবল একটি সম্মেলন।

এর অর্থ আপনি অবশ্যই রিমোট হিসাবে ফ্ল্যাশ ড্রাইভ যুক্ত করতে পারেন:

git remote add origin /mnt/flashdrive/foo.git

বা, উইন্ডোজে:

git remote add origin F:\foo.git

অথবা এটিকে একটি অতিরিক্ত নামের অতিরিক্ত রিমোট হিসাবে যুক্ত করুন (যদি আপনি originকোথাও কোনও ইন্টারনেট সার্ভারের দিকে নির্দেশ করতে চান ):

git remote add flashdrive /mnt/flashdrive/foo.git

তারপরে আপনি এই রিমোটটি থেকে অন্যের মতো ঠিক ধাক্কা / টানতে পারেন।

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


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

5
file://এছাড়াও একটি বিট আরো নমনীয়। এটি আপনাকে এমন কয়েকটি বৈশিষ্ট্য (অগভীর ক্লোনগুলির মতো) ব্যবহার করতে দেয় যা আপনি কোনও স্থানীয় পাথ দিয়ে করতে পারবেন না।
অস্টিন হেমেলগারন

1
@ আয়রনগ্র্যামলিন আপনি কি এই "অংশীদারি কর্তৃপক্ষের" ধারণাটি প্রসারিত করতে পারবেন? আমি গিট বিশেষজ্ঞ নই এবং আপনি কী বলতে চাইছেন তা জানতে আগ্রহী।
18:38

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

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

46

একটি উপর একক কম্পিউটার, বিশেষ কিছু প্রয়োজন হয়। git initআপনার পছন্দসই ডিরেক্টরিতে চালান এবং গিটের সাথে যেমন আপনি পছন্দ করেন তেমন কাজ করুন।

একাধিক কম্পিউটারে একটি সংগ্রহস্থল সিঙ্ক্রোনাইজ করার জন্য , বিভিন্ন পদ্ধতি রয়েছে।

পদ্ধতি 1 এ (কোনও নেটওয়ার্ক নেই): আপনি ইউএসবি স্টিকের উপর একটি 'বেয়ার রিপোজিটরি' তৈরি করতে পারেন, তারপরে এটি চাপুন এবং অন্য যে কোনও রিমোট রিপোজিটরির মতো আপনি এটিকে টানুন। অন্য কথায়, স্থানীয় পাথগুলির মাধ্যমে সংগ্রহস্থল পরিচালনাগুলি এসএসএইচ বা এইচটিটিপিএস ইউআরএল এর মাধ্যমে অপারেশন থেকে আলাদা নয়।

  1. একটি 'রিমোট' সংগ্রহস্থল তৈরি করুন:

    $ git init --bare /mnt/Stick/Repositories/Large_Project.git
    
  2. কম্পিউটার 1-এ, সমস্ত কিছু এতে চাপ দিন:

    $ cd ~/Large_Project
    $ git remote add usb /mnt/Stick/Repositories/Large_Project.git
    $ git push usb master
    
  3. কম্পিউটার 2 এ, ঠিক আছে, সর্বদা হিসাবে একই same

    $ git remote add usb /mnt/Stick/Repositories/Large_Project.git
    $ git pull usb
    

(আপনি সরাসরি ইউআরএল বা পাথ থেকেও চাপ / আনতে / টানতে পারেন))

পদ্ধতি 1 বি (অভ্যন্তরীণ নেটওয়ার্ক): আপনার যদি এসএসএইচ সহ কোনও অভ্যন্তরীণ সার্ভার উপলব্ধ থাকে এবং যদি এটিতে গিট ইনস্টল থাকে তবে আপনি উপরের মতো একই কাজ করতে পারেন , কেবল [user@]host:pathবা ssh://[user@]host/pathসিনট্যাক্স ব্যবহার করে কোনও এসএসএইচ ঠিকানা নির্দিষ্ট করুন ।

  1. git init --bare <somepath.git>মনোনীত সার্ভারে (এসএসএইচ) চালিয়ে একটি 'রিমোট' সংগ্রহস্থল তৈরি করুন ।

  2. কম্পিউটার 1-তে, আগে যেমন প্রদর্শিত হয়েছিল way

    $ git remote add origin myserver.example.com:Gits/Large_Project.git
    

    বা আপনি যদি পছন্দ করেন:

    $ git remote add origin ssh://myserver.example.com/Gits/Large_Project.git
    
  3. কম্পিউটার 2 এ, আবার পদ্ধতি 1 এ হিসাবে একই।


পদ্ধতি 2: আপনি 'ট্রান্সফার বান্ডিল' তৈরি করতে পারেন যা প্রদত্ত তালিকার তালিকাটি একটি একক ফাইলে সংরক্ষণাগারভুক্ত করে।

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

  1. কম্পিউটার 1-এ, পুরো শাখার একটি বান্ডিল তৈরি করুন:

    $ cd ~/Large_Project
    $ git bundle create /mnt/Stick/Project.bundle master
    $ git tag -f last-bundled master
    
  2. কম্পিউটার 2-তে, বান্ডিলটি এমনভাবে টানুন যেন এটি কোনও সংগ্রহস্থল:

    $ cd ~/Large_Project
    $ git pull /mnt/Stick/Project.bundle
    

পরবর্তী বান্ডিলগুলিকে পুরো প্যাক করার দরকার নেই master- তারা কেবল নতুন যুক্ত করা কমিটগুলি last-bundled..masterপরিবর্তে প্যাক করতে পারে ।

  1. কম্পিউটার 1-এ, নতুন যুক্ত হওয়া কমিটগুলির একটি বান্ডিল তৈরি করুন:

    $ cd ~/Large_Project
    $ git bundle create /mnt/Stick/Project.bundle last-bundled..master
    $ git tag -f last-bundled master
    
  2. উপরের মতই.


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

manual tagging or note-keeping is needed, রেপো যদি খুব বড় না হয় তবে একটি বিকল্প git bundle create my.bundle --all
হ'ল:,

আমি এই উত্তরটি আরও বেশি পছন্দ করি কারণ এটি গ্রহণযোগ্য উত্তর এবং এটি একই জিনিস বলে যদিও এটি আরও চিত্রিত।
রাইস্ট্রাম

"বেয়ার" বিকল্পটির তাত্পর্য কী?
18:40

1
এটি 'ওয়ার্কিং ট্রি' (সম্পাদনাযোগ্য ফাইল) ব্যতীত কেবল একটি ডাটাবেস (আপনি সাধারণত .git/হিডেন ফোল্ডারে কী দেখতে পাবেন ), এমন একটি সংগ্রহস্থল তৈরি করে । এটি আপনার সংগ্রহস্থলগুলির জন্য পছন্দসই ফর্ম git push
মাধ্যাকর্ষণ

20

git bundle create

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

প্রতিটি "গিট পুশ" ফাইল তৈরিতে পরিণত হয়, "গিট ফ্যাচ" সেই ফাইল থেকে জিনিস আনয়ন করে।

ডেমো সেশন

প্রথম সংগ্রহস্থল তৈরি এবং প্রথম "পুশ" করছেন

gitbundletest$ mkdir repo1

gitbundletest$ cd repo1

repo1$ git init
Initialized empty Git repository in /tmp/gitbundletest/repo1/.git/
repo1$ echo 1 > 1 && git add 1 && git commit -m 1
[master (root-commit) c8b9ff9] 1
 1 file changed, 1 insertion(+)
 create mode 100644 1

repo1$ git bundle create /tmp/1.bundle master HEAD
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 384 bytes | 384.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)

দ্বিতীয় সংগ্রহস্থলটিতে (অর্থাৎ দ্বিতীয় কম্পিউটার) "ক্লোনিং":

gitbundletest$ git clone /tmp/1.bundle repo2
Cloning into 'repo2'...
Receiving objects: 100% (3/3), done.

gitbundletest$ cd repo2/

repo2$ cat 1
1

কিছু পরিবর্তন করা এবং এগুলিকে অন্য একটি বান্ডিল ফাইলে "পুশ" করা হচ্ছে:

repo2$ echo 2 > 1 && git add 1 && git commit -m 2
[master 250d387] 2
 1 file changed, 1 insertion(+), 1 deletion(-)

repo2$ git bundle create /tmp/2.bundle origin/master..master origin/HEAD..HEAD
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Writing objects: 100% (3/3), 415 bytes | 415.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)

প্রথম সংগ্রহস্থলটিতে "টানছে" পরিবর্তনগুলি:

repo2$ cd ../repo1

repo1$ git pull /tmp/2.bundle 
Receiving objects: 100% (3/3), done.
From /tmp/2.bundle
 * branch            HEAD       -> FETCH_HEAD
Updating c8b9ff9..250d387
Fast-forward
 1 | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

repo1$ cat 1
2

প্রথম বান্ডিলের বিপরীতে, দ্বিতীয়টিতে কেবল আংশিক গিট ইতিহাস রয়েছে এবং এটি সরাসরি ক্লোনযোগ্য নয়:

repo1$ cd ..

gitbundletest$ git clone /tmp/2.bundle repo3
Cloning into 'repo3'...
error: Repository lacks these prerequisite commits:
error: c8b9ff94942039469fa1937f6d38d85e0e39893a 
fatal: bad object 250d38747656401e15eca289a27024c61e63ed68
fatal: remote did not send all necessary objects

বান্ডিলগুলি ব্যবহার করার অসুবিধা রয়েছে যা আপনাকে প্রতিটি বান্ডেলে কী পরিমাণ কমিটের অন্তর্ভুক্ত থাকতে হবে তা ম্যানুয়ালি উল্লেখ করতে হবে। বিপরীতে git push, git bundleআগের বান্ডেলে যা ছিল তা রাখে না, আপনাকে ম্যানুয়ালি অ্যাডজাস্ট refs/remotes/origin/masterকরতে হবে বা বান্ডিলগুলি এটির চেয়ে বড় হতে পারে।


--allসবকিছু পেতে পতাকা উল্লেখ করতে ভুলবেন না । রেপো যদি যথেষ্ট ছোট হয় তবে আপনি প্রতিবার কেবল সবকিছু স্থানান্তরিত করার কারণে এটি সহজতম প্রক্রিয়া! কেবল মেমরি স্টিকটি আলগা করবেন না - সম্ভবত সবচেয়ে বড় সুরক্ষা সমস্যা!
ফিলিপ ওকলি

7

আপনাকে প্রথমে গিট ইনস্টল করতে হবে । তারপরে একটি নতুন সংগ্রহশালা তৈরি করতে, আপনার অনুলিপি করা ফোল্ডারের মধ্যে চালান:

git init

তারপরে আপনি সংস্করণ নিয়ন্ত্রণ করতে চান এমন ফাইলগুলি git add( -aসমস্ত ফাইলের জন্য যুক্ত করুন ) যোগ করতে পারেন এবং পরিবর্তনগুলি ( git commit) পরিবর্তন করা শুরু করতে পারেন ।

আপনাকে কোনও দূরবর্তী স্থানে যেতে হবে না, কারণ আপনি নিজের স্থানীয় ইতিহাস ( git log) এ কাজ করতে পারেন ।

আরও তথ্যের জন্য, পরীক্ষা করুন:


ইন্টারনেট ছাড়াই ধাক্কা / টানছে

git pushকমান্ড ব্যবহার করে , এসএসএইচ (স্থানীয় সংযোগ, ইন্ট্রনেট ব্যবহার করে) উপর চাপ দেওয়া সম্ভব:

git remote add server ssh://[user@]host.xz[:port]/path/to/dev/repo.git/
git push server

বা ফোল্ডারে ঠেলা:

git push /mnt/usb/my_repo

এটি ধরে নেওয়া হয়েছে যে আপনি আপনার ভাণ্ডারের দুটি অনুলিপি করেছেন।

টানা একই, যেমন

git pull /mnt/usb/my_repo

প্যাচিং

প্যাচ প্রয়োগ করতে, আপনি patchআদেশ বা ব্যবহার করতে পারেন git apply

দেখুন: Git সংগ্রহস্থল থেকে প্যাচ বা পরিবর্তন ফাইল তৈরি করুন এবং অন্য বিভিন্ন Git সংগ্রহস্থলের এটি প্রযোজ্য


5

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

আপনি git initআপনার স্থানীয় ফোল্ডারে চালিয়ে একটি স্থানীয় গিট সংগ্রহস্থল শুরু করতে পারেন । এখানে বর্ণিত হিসাবে


3
আমি জানি যে, তবে আমি অন্য কম্পিউটারে কাজ করতে এবং কোনও ইন্টারনেট অ্যাক্সেসবিহীন সার্ভারের ফাইলগুলিতে এটি প্রয়োগ করতে চাই
টুটু কইন

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

2
@ ধা - স্থানীয়ভাবে কীভাবে গিট ব্যবহার করবেন সে সম্পর্কে আরও বিশদ দেওয়ার জন্য দয়া করে কিছুক্ষণ সময় নিন। এটি সম্পন্ন করা যেতে পারে কেবল তা বোঝানো কোনও উত্তরের সহায়ক নয়।
রামহাউন্ড

2
@ বেনামে লুর্কার পরিবেশন করা খুব গুরুত্বপূর্ণ প্রতিষ্ঠানে বন্ধ নেটওয়ার্কে ডেটা পরিবেশন করছে। এটি কেবল বিস্তৃত ইন্টারনেটে কোনও কিছুই সরবরাহ করে না, কারণ ডেটা অত্যন্ত সূক্ষ্ম এবং কেবলমাত্র কর্মীদের জন্য।
টুটু কইন

1
@ টুটুকাইন: এতে যদি কোনও নেটওয়ার্ক অ্যাক্সেস থাকে তবে আপনি সর্বদা এসএসএইচ এর মাধ্যমে নিজের গিট সার্ভার চালাতে পারবেন। গিটের কাছে গিটহাবের চেয়ে আরও অনেক কিছুই আছে।
মাধ্যাকর্ষণ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.