এসভিএন: গিতে বহিরাগত সমান?


177

আমার দুটি এসভিএন প্রকল্প রয়েছে অন্য এসভিএন সংগ্রহস্থল থেকে এসএনএন: এক্সটার্নাল ব্যবহার করে ।

গিটে আমি কীভাবে একই সংগ্রহস্থলের বিন্যাস কাঠামো রাখতে পারি?


গিট সাবমডিউলগুলি আপনার খোঁজ করা উচিত । আপনি যা খুঁজছেন ঠিক এটির অনুমতি দেওয়া উচিত।
ফক্সস্ট্রোট

7
গত ৪ বছরে কারও কাছেই এর নতুন উত্তর আছে, নাকি আজ গিটের জগত একই রকম?
ডগডাব্লু

4
@ ডগডাব্লু হ্যাঁ, আমার নীচে একটি নতুন উত্তর রয়েছে : git submoduleএখন অনুকরণ করতে পারবেন svn:external(মার্চ ২০১৩ সাল থেকে)।
ভনসি

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

উত্তর:


134

গিটের দুটি পদ্ধতির সমান, তবে এসএনএন-এর বহিরাগত:

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

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


17
এফওয়াইআই, এখন এসএনএন-এর সাথে নির্দিষ্ট সংশোধনগুলি নির্দিষ্ট করা সম্ভব: বহিরাগত এখন (1.5 বা 1.6 সাল থেকে আমি বিশ্বাস করি?)
নট পার্সসন

9
এফওয়াইআই, গিট সাবমডিউলগুলি স্বয়ংক্রিয়ভাবে পরিচালনা এবং কমিট হতে পারে। গিট একটি .gitmodules ফাইল তৈরি করে যা .gitignore ফাইলের মতোই কমিট করা উচিত। আরও তথ্যের জন্য [ git-scm.com/book/en/Git-Tools-Submodules] দেখুন।
মিকিজভ

5
@ নেট পারসনস এর সাথে সঠিক সংশোধন সংখ্যা নির্দিষ্ট করা সর্বদা সম্ভব হয়েছে svn:externals। 1.5.০ রিভিশন সহ সিনট্যাক্সটি আরও নমনীয় বিন্যাসে পরিবর্তন করা হয়েছিল। যা যুক্ত করা হয়েছিল তা ছিল আপেক্ষিক ইউআরএল ঠিকানা।
ডেভিড ডব্লিউ।

@ নাটপারসন তবে কি গিট
সাবমডিউলগুলি

আমার মনে হয়
এসভিএন

38

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

git config -f .gitmodules submodule.<path>.branch <branch>

সাবমোডুলের জন্য একটি শাখা অনুসরণ করা যথেষ্ট (একটি সাবমডিউল আপস্ট্রিম রেপোর একটি দূরবর্তী শাখার সর্বশেষ প্রতিশ্রুতি হিসাবে )। আপনাকে যা করতে হবে তা হ'ল:

git submodule update --remote

এটি সাবমডিউল আপডেট করবে।

আরও বিশদগুলি " git submoduleসর্বশেষ ট্র্যাকিংয়ের " মধ্যে রয়েছে।

বিদ্যমান সাবমোডিয়ালটিকে একটি শাখার ট্র্যাকিংকে একটিতে রূপান্তর করতে : " গিট সাবমডিউলস: একটি শাখা / ট্যাগ উল্লেখ করুন " এ সমস্ত পদক্ষেপ দেখুন ।


আপনি কি এর মতো আংশিক চেকআউট করতে পারেন svn:externals?
এখন

@nowox হ্যাঁ, আপনি বিক্ষিপ্ত চেকআউট থাকতে পারে (Git 1.7+ stackoverflow.com/a/2372044/6309 ) submodules (যুক্ত stackoverflow.com/a/17693008/6309 )
VonC

দুর্ভাগ্যক্রমে সমস্ত স্পার্স চেকআউট সম্পর্কিত উত্তরগুলি কখনই কোনও উদাহরণ দেয় না :( আমি এর জন্য একটি গিস্ট উদাহরণ লেখার চেষ্টা করব ...
অক্সেক্স

এটি এখনও একটি সমস্যা আছে। আপনার এখনও একটি সংগ্রহস্থলের পুরো ইতিহাসটি পেতে হবে যেখানে আপনার কেবলমাত্র একটি ছোট অংশ প্রয়োজন। আমার ক্ষেত্রে 2 গিগাবাইটের চেয়ে 100 কিলোবাইট বেশি। আমি অবশ্যই ব্যবহার করতে পারি --depthতবে এটি সমস্যার সমাধান করে না।
এখন

@ নওফক্স আপনার ব্যবহারের ক্ষেত্রে কী তা সঠিকভাবে ব্যাখ্যা করে একটি নতুন প্রশ্ন জিজ্ঞাসা করা ভাল: আপনার 2 জিবি রেপো কোনও সাবমডিউল, বা সাবমোডুল সহ একটি প্রধান রেপো এবং এটি থেকে আপনাকে কী বের করতে হবে তা আমার কোনও ধারণা নেই।
ভোনসি

3

আমি গিল (গিট লিঙ্কস) সরঞ্জামটির লেখক

আমার সমস্যার বিকল্প সমাধান আছে - গিল (গিট লিঙ্কস) সরঞ্জাম

এটি জটিল গিট সংগ্রহস্থলগুলির নির্ভরতাগুলি বর্ণনা ও পরিচালনা করতে দেয়।

এছাড়াও এটি গিট रिकर्सিভ সাবমডিউলগুলি নির্ভরতা সমস্যার সমাধান দেয়

আপনার নিম্নলিখিত প্রকল্প নির্ভরতা বিবেচনা করুন: নমুনা গিট সংগ্রহস্থল নির্ভরতা গ্রাফ

তারপরে আপনি .gitlinksসংগ্রহস্থল সম্পর্কিত বিবরণ দিয়ে ফাইলটি সংজ্ঞায়িত করতে পারেন :

# Projects
CppBenchmark CppBenchmark https://github.com/chronoxor/CppBenchmark.git master
CppCommon CppCommon https://github.com/chronoxor/CppCommon.git master
CppLogging CppLogging https://github.com/chronoxor/CppLogging.git master

# Modules
Catch2 modules/Catch2 https://github.com/catchorg/Catch2.git master
cpp-optparse modules/cpp-optparse https://github.com/weisslj/cpp-optparse.git master
fmt modules/fmt https://github.com/fmtlib/fmt.git master
HdrHistogram modules/HdrHistogram https://github.com/HdrHistogram/HdrHistogram_c.git master
zlib modules/zlib https://github.com/madler/zlib.git master

# Scripts
build scripts/build https://github.com/chronoxor/CppBuildScripts.git master
cmake scripts/cmake https://github.com/chronoxor/CppCMakeScripts.git master

প্রতিটি লাইন নিম্নলিখিত বিন্যাসে গিট লিঙ্ক বর্ণনা করে:

  1. সংগ্রহস্থলের অনন্য নাম
  2. সংগ্রহস্থলের সম্পর্কিত পাথ (.gitlinks ফাইলের পথ থেকে শুরু হয়েছে)
  3. গিট সংগ্রহস্থল যা চেকআউট করার জন্য গিট ক্লোন কমান্ড রেপোজিটরি শাখায় ব্যবহৃত হবে
  4. # দিয়ে শুরু করা খালি লাইন বা লাইনটি পার্স করা হয় না (মন্তব্য হিসাবে বিবেচিত)।

শেষ পর্যন্ত আপনাকে আপনার মূলের নমুনা সংগ্রহস্থলটি আপডেট করতে হবে:

# Clone and link all git links dependencies from .gitlinks file
gil clone
gil link

# The same result with a single command
gil update

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

শিশু লিঙ্কযুক্ত সংগ্রহস্থলের সমস্ত পরিবর্তনের সাথে যদি আপনি কিছু সংগ্রহস্থলের সমস্ত পরিবর্তন করতে চান তবে আপনি এটি একটি একক আদেশ দ্বারা করতে পারেন:

gil commit -a -m "Some big update"

টানুন, পুশ কমান্ডগুলি একইভাবে কাজ করে:

gil pull
gil push

গিল (গিট লিঙ্কস) সরঞ্জামটি নিম্নলিখিত কমান্ডগুলিকে সমর্থন করে:

usage: gil command arguments
Supported commands:
    help - show this help
    context - command will show the current git link context of the current directory
    clone - clone all repositories that are missed in the current context
    link - link all repositories that are missed in the current context
    update - clone and link in a single operation
    pull - pull all repositories in the current directory
    push - push all repositories in the current directory
    commit - commit all repositories in the current directory

গিট রিকার্সি সাবমডিউলগুলি নির্ভরতা সমস্যা সম্পর্কে আরও ।


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