গিট-এসএনএন: `এসএনএন সুইচ - আরলোক্টের সমতুল্য কী?


89

গিট-এসএনএন-এর মাধ্যমে আমি যে মিউনিসিফায়ারটি করছি তা ইউআরএল পরিবর্তন করেছে changed

ভ্যানিলা এসএনএন-এ আপনি ঠিক করবেন svn switch --relocate old_url_base new_url_base

গিট-এসএনএন ব্যবহার করে এটি কীভাবে করব?

কেবল কনফিগার ফাইলে এসএনএন ইউআরএল পরিবর্তন করা ব্যর্থ হয়।


আপনার চেষ্টা করা উচিত এবং সম্ভবত এই উত্তরটি গ্রহণ করা উচিত: stackoverflow.com/a/4061493/1221661
ফ্রিটজ

সর্বাধিক আপ টু ডেট উত্তর: stackoverflow.com/a/40523789/537554 । একই প্রশ্ন, তবে একজন গিট ব্যবহারকারীর দৃষ্টিকোণ থেকে জিজ্ঞাসা করা হয়েছে।
রাইনেস

উত্তর:


61

এটি আমার পরিস্থিতি বেশ ভালভাবে পরিচালনা করে:

https://git.wiki.kernel.org/index.php/GitSvnSwitch

আমি file://প্রোটোকলটি ব্যবহার করে ক্লোন করেছি , এবং প্রোটোকলটিতে স্যুইচ করতে চেয়েছিলাম http://

এটি বিভাগে urlসেটিংস সম্পাদনা করার জন্য লোভনীয় , কিন্তু নিজস্বভাবে এটি কাজ করে না। সাধারণভাবে আপনাকে নিম্নলিখিত পদ্ধতি অনুসরণ করতে হবে:[svn-remote "svn"].git/config

  1. urlনতুন নামে এসএনএন-রিমোট সেটিংটি স্যুইচ করুন ।
  2. চালান git svn fetch । এর জন্য এসএনএন থেকে কমপক্ষে একটি নতুন সংশোধনী আনতে হবে!
  3. urlমূল URL এ ফিরে এসএনএন-রিমোট সেটিংস পরিবর্তন করুন ।
  4. git svn rebase -lএকটি স্থানীয় পুনর্বাসনা করতে চালান (শেষ আনার ক্রিয়াকলাপের সাথে যে পরিবর্তনগুলি আসল সেগুলি সহ)।
  5. এসএনএন-রিমোট পরিবর্তন করুন urlনতুন ইউআরএলে সেটিংস ।
  6. এখন, git svn rebaseআবার কাজ করা উচিত।

দু: সাহসিক আত্মারা চেষ্টা করতে চাইতে পারেন --rewrite-root


4
সত্যি কথা বলতে গেলে, এটি আসলে আমার পক্ষে ব্যর্থ হয়েছিল এবং আমি রেপোকে পুনরায় ক্লোনিং করে শেষ করি। যখন এসএনএন ডিরেক্টরিটির পুনরায় নামকরণ করা হয় তখন এটি পরিচালনা করতে গিট পাওয়া শক্ত।
গ্রেগ লিন্ড

আমি আরও বিস্তারিত লেখার গ্রহণ করতে পছন্দ করব তবে যথেষ্ট ন্যায্য, আমি নতুন উত্তর না আসা পর্যন্ত এটিকে গ্রহণ করব।
kch

4
এই পদ্ধতির আরও একটি বিবরণ এখানে দেওয়া হয়েছে: theadmin.org/articles/git-svn-switch-to-a-differences-a-svn-url
n8gg

গৃহীত উত্তরের প্রদত্ত লিঙ্কটি পুরানো এবং এখনকার নতুনটি হ'ল: git.wiki.kernel.org/articles/g/i/t/GitSvnSwitch_8828.html আমি "জেনারেল কেস" অনুসরণ করেছি এবং এটি সহজ এবং সত্যই ছিল ভাল কাজ করেছে।
টিসিমাষ্টার

4
@ টিসিএমস্টার: আমার পক্ষেও কাজ করেছেন ... তবে সে কারণেই উত্তরগুলিতে কেবল লিঙ্ক থাকা উচিত নয় , সেগুলি পুরানো হয়ে যায় এবং অকেজো হয়ে যায় ... আমি একটি সম্প্রদায় উইকি উত্তর যুক্ত করতে চলেছি।
আঙ্কেলজিভ

38

নিম্নলিখিতগুলি ঠিক আছে কিনা তা আপনি দেখতে পারেন:

  1. তাহলে svn-remote.svn.rewriteRootকনফিগ ফাইল বিদ্যমান নেই ( .git/config):

    git config svn-remote.svn.rewriteRoot <currentRepositoryURL>
    
  2. তাহলে svn-remote.svn.rewriteUUIDকনফিগ ফাইল বিদ্যমান নেই:

    git config svn-remote.svn.rewriteUUID <currentRepositoryUUID>
    

    currentRepositoryUUIDথেকে প্রাপ্ত করা যাবে .git/svn/.metadata

  3. git config svn-remote.svn.url <newRepositoryURL>


কল্পনাপ্রসূত - ধন্যবাদ, এটি আমার জন্য দুর্দান্ত কাজ করেছে (ক্লোন হয়ে file://, স্যুইচ করুন svn+ssh); শুধু লক্ষণীয়: এই পদ্ধতিটির জন্য "এসএনএন থেকে কমপক্ষে একটি নতুন সংশোধনী আনতে হবে"; এছাড়াও ./.git/svn/.metadataপ্রথম পর svn rebaseরয়েছে <newRepository>যেমন reposRoot- কিন্তু এই মুছে ফেলার জন্য যথেষ্ট নয় rewrite*থেকে চাবি .git/config; এইভাবে এই কীগুলি স্থায়ীভাবে সেখানে রাখা উচিত, যতদূর আমি এটি বুঝতে পারি।
sdaau

4
এটি আমার কাছেও মনোহরের মতো কাজ করেছিল। ওপির উচিত এটি চেষ্টা করে সঠিক উত্তর হিসাবে পাওয়া উচিত।
রাফারিনো

পারফেক্ট আমি ইতিহাসে হাজারো কমিটমেন্ট নিয়ে একটি বড় প্রকল্প করেছি যাতে কোনও নতুন ক্লোনটি ইতিহাসটি ধ্বংস করে দেয় (বা চেকআউট করার জন্য সত্যই দীর্ঘ সময় নিতে পারে)। আমি ব্যবহার করছি svn+ssh://এবং আমাদের এসএনএন-সার্ভার সবেমাত্র আমাদের অভ্যন্তরীণ নামকরণকে স্যানিটাইজ .seকরতে ডোমেন পরিবর্তন করেছে .com
উলফআর

আমার জন্য একটি ট্রিট কাজ। এক হাজার বছরের কমিটস সহ 2 বছরের পুরাতন রেপো ছিল, রেপোটি একটি নতুন হোস্টে স্থানান্তরিত হয়েছিল, সুতরাং এটি একটি (আতঙ্কিত) পূর্ণ এসএনএন ক্লোনকে এড়িয়ে গেল।
ডেভিড ভিক্টর

21

দুর্ভাগ্যক্রমে এই উত্তরগুলির বেশিরভাগ লিঙ্ক কাজ করছে না, তাই আমি ভবিষ্যতের রেফারেন্সের জন্য গিট উইকির কাছ থেকে কিছু তথ্য নকল করতে চলেছি ।

এই সমাধানটি আমার পক্ষে কাজ করেছে:

  • নতুন ডোমেন / url / পাথের দিকে নির্দেশ করতে svn-remote url(বা fetchপাথ) সম্পাদনা করুন.git/config

  • রান Git git svn fetchএর জন্য এসএনএন থেকে কমপক্ষে একটি নতুন সংশোধনী আনতে হবে!

  • আপনি যদি git svn rebaseএখন চেষ্টা করেন তবে আপনি এর মতো একটি ত্রুটি বার্তা পাবেন:

    Unable to determine upstream SVN information from working tree history
    

    আমি মনে করি এটি কারণ git svnহিসাবে বিভ্রান্ত হয়েছে যে আনার আগে আপনার সর্বশেষ প্রতিশ্রুতিটি git-svn-idপুরানো পথটির দিকে ইঙ্গিত করবে , যা পাওয়াটির সাথে মিলছে না .git/config

  • কার্যকারণ হিসাবে, মূল ডোমেন / ইউআরএল / পথে ফিরে svn-remote url(বা fetchপথ) পরিবর্তন করুন

  • git svn rebase -lশেষ আনতে গিয়ে অপারেশনটি নিয়ে আসা পরিবর্তনগুলির সাথে একটি স্থানীয় রিবেস করতে এখনই আবার চালান । এবার এটি হবে , সম্ভবত এটি কারণ git svnযে git-svn-idনতুন মাথাটি পাওয়া যায় নি তার সাথে মিলছে না তা নিয়ে বিভ্রান্ত হবে না .git/config

  • অবশেষে, পরিবর্তন svn-remote url (বা fetchপাথ) নতুন ডোমেন / url / পথে ফিরে আসুন

  • এই সময়ে git svn rebaseআবার কাজ করা উচিত!

মূল তথ্য এখানে পাওয়া গেছে


3

গিট এসএনএন এসএনএন এর উপর নির্ভর করে on এসএনএন থেকে আমদানি করা প্রতিটি প্রতিশ্রুতিতে একটি থাকেgit-svn-id এসএনএন ইউআরএল অন্তর্ভুক্ত থাকে।

একটি বৈধ স্থানান্তরের কৌশলটি হ'ল git-svn cloneনতুন সংগ্রহস্থলটিতে কল করা এবং সেই পরিবর্তনগুলি সেই নতুন নিকটে মিশ্রিত করা। আরও বিস্তারিত পদ্ধতির জন্য এই নিবন্ধটি দেখুন:

http://www.sanityinc.com/articles/relocating-git-svn-repositories


2

git filter-branch

একটি ব্লগ এন্ট্রি থেকে নেওয়া এই স্ক্রিপ্টটি আমার পক্ষে কাজ করেছে। পুরানো এবং নতুন রেপো URL যেমন প্যারামিটার হিসাবে সরবরাহ করে ঠিক তেমনি svn switch --relocate

স্ক্রিপ্টটি প্রতিশ্রুতি বার্তাগুলি, আপডেটগুলিতে এবং git filter-branchসাবটারভিউশন ইউআরএলগুলি প্রতিস্থাপন করতে কল করে এটি ব্যবহার করে পুনরায় তৈরি করে मेटाটাটা আপডেট করে । যদিও এটি আরও শক্তিশালী সমাধান হতে পারে, তবে বিশাল সংগ্রহস্থলগুলির জন্য ঘন্টা (ঘন্টা কয়েক দিন) খুব দ্রুত কাজ করে।git-svn-id.git/configgit-svngit svn rebasegit svn clonefilter-branch

#!/bin/sh

# Must be called with two command-line args.
# Example: git-svn-relocate.sh http://old.server https://new.server
if [ $# -ne 2 ]
then
  echo "Please invoke this script with two command-line arguments (old and new SVN URLs)."
  exit $E_NO_ARGS
fi

# Prepare URLs for regex search and replace.
oldUrl=`echo $1 | awk '{gsub("[\\\.]", "\\\\\\\&");print}'`
newUrl=`echo $2 | awk '{gsub("[\\\&]", "\\\\\\\&");print}'`

filter="sed \"s|^git-svn-id: $oldUrl|git-svn-id: $newUrl|g\""
git filter-branch --msg-filter "$filter" -- --all

sed -i.backup -e "s|$oldUrl|$newUrl|g" .git/config

rm -rf .git/svn
git svn rebase

1

git_fast_filter

তা সত্ত্বেও যতো তাড়াতাড়ি git-filter-branch(অর্থাত, পরিবর্তে ঘন্টার মিনিট), কিন্তু আত্মা অনুরূপ, ব্যবহার করা git_fast_filter। তবে এর জন্য আরও কিছুটা কোডিং দরকার এবং ঝরঝরে কোনও প্রস্তুত-প্যাকযুক্ত সমাধান উপস্থিত নেই। এর বিপরীতে git-filter-branch, এটি কোনও পুরানো থেকে একটি নতুন রেপো তৈরি করবে । এটি ধরে নেওয়া হয় যে শেষ এসভিএন কমিটকে নির্দেশ করে।master

  1. ক্লোন git_fast_filterগিটারিয়াস রেপো থেকে ।
  2. একই ডিরেক্টরির যেখানে আপনি ক্লোন একটি পাইথন স্ক্রিপ্ট তৈরি করুন git_fast_filterউপর ভিত্তি করে এই সারকথা ব্যবহার এক্সিকিউটেবল বিট সেটchmod +x । পুরানো এবং নতুন ভান্ডার পাথগুলি মানিয়ে নিন। (স্ক্রিপ্টের বিষয়বস্তু নীচেও আটকানো হয়েছে))
  3. git initএই নতুন রেপোতে ওয়ার্কিং ডিরেক্টরিটি পরিবর্তন করে একটি নতুন টার্গেট সংগ্রহস্থল শুরু করুন ।
  4. নিম্নলিখিত পাইপ কার্যকর করুন:

    (cd path/to/old/repo && git-fast-export --branches --tags --progress=100) | \
        path/to/git_fast_filter/commit_filter.py | git-fast-import
    
  5. পুরানো রেপো থেকে নতুন রেপোতে অনুলিপি করুন .git/configএবং সম্ভবত অন্যান্য সম্পর্কিত ফাইল .git/info

  6. সরান .git/svn
  7. git-svnনতুন সংশোধন নম্বর ম্যাপিং সম্পর্কে সচেতন করুন

    1. এক্সিকিউট git branch refs/remotes/git-svn master

      • আপনার গিট-এসএনএন রিমোটগুলিকে refs/remotes/git-svnপরামর্শ .git/config, svn-remoteবিভাগগুলি থেকে আলাদা বলা যেতে পারে
    2. সম্পাদন git svn info। যদি এই আদেশটি হিমশীতল হয় তবে কিছু ভুল আছে। এটি সংশোধন নম্বর ম্যাপিং পুনর্নির্মাণ করা উচিত।

    3. জাল শাখা সরান refs/remotes/git-svn, এটি দ্বারা পুনরায় তৈরি করা হবেgit-svn

  8. কল করে সিঙ্ক্রোনাইজ করুন git svn rebase

নীচে এর বিষয়বস্তুগুলি যথাযথ এবং যথাযথ হিসাবে commit_filter.pyপ্রতিস্থাপন করুন :IN_REPOOUT_REPO

#!/usr/bin/python

from git_fast_filter import Commit, FastExportFilter
import re
import sys

IN_REPO = "https://svn.code.sf.net/p/matsim/code"
OUT_REPO = "https://svn.code.sf.net/p/matsim/source"

IN_REPO_RE = re.compile("^git-svn-id: %s" % re.escape(IN_REPO), re.M)
OUT_REPO_RE = "git-svn-id: %s" % OUT_REPO

def my_commit_callback(commit):
  commit.message = IN_REPO_RE.sub(OUT_REPO_RE, commit.message)
  sys.stderr.write(".")

filter = FastExportFilter(commit_callback = my_commit_callback)
filter.run()

0

উপরের git svn rebase -lসমাধানটি আমার পক্ষে কার্যকর হয়নি। আমি এটিকে অন্যরকমভাবে চলার সিদ্ধান্ত নিয়েছি:

  1. পুরানো এসভিএন রেপো গিট রেপোতে oldএবং নতুন এসভিএন গিট রেপোতে ক্লোন করুনnew
  2. পান oldমধ্যেnew
    • cd new
    • git fetch ../old
    • git tag old FETCH_HEAD
  3. newউপরে রিবেস old(সফল হওয়া উচিত কারণ মূলের গাছ newএবং এর ডগা oldএকরকম থাকে)
    • git checkout master(ধরে নিই যে masterশাখাটি এসভিএন হেডের দিকে ইঙ্গিত করছে This এটি একটি ক্লিন ক্লোনার ক্ষেত্রে হবে; অন্যথায় আপনি শুরু করার আগে ডিসকমিট)
    • git rebase --root --onto old
  4. রিবেসের newজন্য অ্যাকাউন্টে গিট-এসএনএন মেটাডেটা পুনর্নির্মাণ করুন
    • git update-ref --no-deref refs/remotes/git-svn master(আপনি কীভাবে ক্লোন করেছেন তার উপর নির্ভর করে রিমোট রেফটি সামঞ্জস্য করুন, যেমন এটি হতে পারে refs/remotes/svn/trunk)
    • rm -r .git/svn
    • git svn info

1. আপনি কি নতুন লোকেশনের নতুন ক্লোনটি দিয়ে শুরু করছেন? যদি হ্যাঁ, আপনি কেন এই মুহুর্তে করা হয় না? ২. আপনি যদি পুরানোতে নতুন রিবেস করেন তবে আপনার পুরানো প্রতিশ্রুতিগুলি কি সমস্তগুলি তাদের এসএনএন-আইডি লগ এন্ট্রি করে পুরানো ইউআরএল উল্লেখ করে? ৩. এমন কোনও ডকুমেন্টেশন আছে যা .git / এসএনএন অপসারণে সেভ হয়? (3 বি: কোন আদেশটি গিট-এসএনএন মেটাডেটা, গিট এসএনএন তথ্য পুনর্নির্মাণ করছে?)
মাইখা উইডেনম্যান

0

এই প্রশ্নের অন্যান্য প্রতিক্রিয়াগুলির ভিত্তিতে আমি একটি রুবি স্ক্রিপ্ট নিয়ে এসেছি যা গিট-এসএনএন স্থানান্তরিত পরিচালনা করে। আপনি এটি https://gist.github.com/henderea/6e779b66be3580c9a584 এ পাবেন ।

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

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

স্ক্রিপ্টটি আপনাকে কোনও পরিবর্তন করার আগে রেপুরের একটি অনুলিপি তৈরি করার বিকল্প দেয় যাতে আপনি ব্যাকআপ তৈরি করতে এই বিকল্পটি ব্যবহার করতে পারেন। আপনার যদি কোনও শাখায় আন-ঠেলা পরিবর্তন হয় তবে একটি অনুলিপি তৈরি করা দরকার।

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

আশা করি আমার স্ক্রিপ্ট অন্য কারও পক্ষে কার্যকর প্রমাণিত হবে। লিপি পরিবর্তন করতে নির্দ্বিধায়।

দ্রষ্টব্য: আমি এই স্ক্রিপ্টটি কেবল ওএস এক্স 10.10 ইওসোমাইটে গিটার 2.3.0 / 2.3.1 এবং রুবি ২.২.০ দিয়ে পরীক্ষা করেছি, তবে এটি অন্যান্য পরিবেশেও কাজ করবে বলে আমি আশা করব। যদিও উইন্ডোজ সম্পর্কে কোনও গ্যারান্টি নেই।

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