un-submodule a git submodule


378

আমি কীভাবে গিট সাবমডিউল আন-সাব-মডিউল করব (সমস্ত কোডটি মূলটিতে ফিরিয়ে আনব)?

"সেরা পদ্ধতিতে" যেমন "আমার" কীভাবে করা উচিত ...


5
দ্রষ্টব্য: git1.8.3 দিয়ে, আপনি এখন চেষ্টা করতে পারেন git submodule deinit, আমার উত্তর নীচে দেখুন
ভোনসি

6
আমি ভুল বুঝে উঠতে পারি, তবে গিট সাবমডিউল ডিনিট কোডটি সরিয়ে ফেলবে বলে মনে হয়।
জো জার্মুস্কা

2
গিট ১.৮.৫ (নভেম্বর ২০১৩) যেহেতু নীচে আমার উত্তরেgit submodule deinit asubmodule ; git rm asubmodule চিত্রিত হয়েছে তেমন একটি সরল যথেষ্ট
ভোনসি

Git ব্যবহারের বিষয়ে বিবেচনা সাবট্রি
Hib

উত্তর:


527

আপনি যা চান তা হ'ল আপনার সাবমডিউল কোডটি মূল সংগ্রহস্থলে রাখার জন্য আপনাকে কেবল সাবমডিউলটি সরিয়ে ফর্মগুলি মূল রেপোতে পুনরায় যুক্ত করতে হবে:

git rm --cached submodule_path # delete reference to submodule HEAD (no trailing slash)
git rm .gitmodules             # if you have more than one submodules,
                               # you need to edit this file instead of deleting!
rm -rf submodule_path/.git     # make sure you have backup!!
git add submodule_path         # will add files instead of commit reference
git commit -m "remove submodule"

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

প্রধান মডিউলটিতে আপনাকে নিম্নলিখিতগুলি করতে হবে:

# Fetch the submodule commits into the main repository
git remote add submodule_origin git://url/to/submodule/origin
git fetch submodule_origin

# Start a fake merge (won't change any files, won't commit anything)
git merge -s ours --no-commit submodule_origin/master

# Do the same as in the first solution
git rm --cached submodule_path # delete reference to submodule HEAD
git rm .gitmodules             # if you have more than one submodules,
                               # you need to edit this file instead of deleting!
rm -rf submodule_path/.git     # make sure you have backup!!
git add submodule_path         # will add files instead of commit reference

# Commit and cleanup
git commit -m "removed submodule"
git remote rm submodule_origin

ফলস্বরূপ সংগ্রহস্থলটি কিছুটা অদ্ভুত দেখাচ্ছে: একাধিক প্রাথমিক প্রতিশ্রুতি থাকবে। তবে এটি গিটের জন্য কোনও সমস্যা সৃষ্টি করবে না।

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


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

5
মূলত, হ্যাঁ কৌশলটি হ'ল গিটটি পুনরায় নামকরণের ক্রিয়াকলাপ সংরক্ষণ করে না: পরিবর্তে এটি পিতামাতার প্রতিশ্রুতিগুলি দেখে তাদের সনাক্ত করে। পূর্ববর্তী প্রতিশ্রুতিতে উপস্থিত কোনও ফাইল সামগ্রী থাকলে, তবে আলাদা ফাইল নাম সহ এটি পুনঃনামকরণ (বা অনুলিপি) হিসাবে বিবেচনা করা হয়। উপরের পদক্ষেপগুলিতে, git mergeনিশ্চিত করে যে প্রতি ফাইলের জন্য "পূর্ববর্তী প্রতিশ্রুতি" থাকবে (সংযুক্তির দুটি "পক্ষের" একটিতে)।
gyim

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

4
@ থেদুকে আমারও এই সমস্যা হয়েছিল এই পদক্ষেপগুলি অনুসরণ করার আগে, আপনার সাবমোডিয়াল সংগ্রহস্থল থেকে সমস্ত ফাইলকে ডিরেক্টরি স্টোরের মধ্যে আপনি যে একত্রে মার্জ করতে চলেছেন ঠিক সেই পথের সাথে একটি ডিরেক্টরি কাঠামোয় স্থানান্তরিত করার আগে এটি সংশোধন করা যেতে পারে : অর্থাৎ। যদি প্রধান সংগ্রহস্থলের আপনার সাবমডিউলটি foo / এ হয়, সাবমোডিয়ালে, সঞ্চালন করুন mkdir foo && git mv !(foo) foo && git commit
ক্রিস ডাউন

35
যোগ করার জন্য প্রয়োজন --allow-unrelated-historiesজাল একত্রীকরণ এ একত্রীকরণ বলপূর্বক হিসাবে আমি পেয়ে ছিল fatal: refusing to merge unrelated histories: এখানে github.com/git/git/blob/master/Documentation/RelNotes/...
vaskort

72

যেহেতু Git 1.8.5 (নভেম্বর 2013 ) ( submodule ইতিহাস পালন ছাড়া ):

mv yoursubmodule yoursubmodule_tmp
git submodule deinit yourSubmodule
git rm yourSubmodule
mv yoursubmodule_tmp yoursubmodule
git add yoursubmodule

ওইটা হবে:

  • নিবন্ধভুক্ত করুন এবং আনলোড করুন (অর্থাত্ সামগ্রীটি মুছুন ) সাবমডিউল ( deinitসুতরাং mv প্রথমটি ),
  • আপনার .gitmodulesজন্য পরিষ্কার করুন ( rm),
  • এবং প্যারেন্ট রেপো ( ) এর সূচীতে সেই সাবমোডল SHA1 উপস্থাপন করে এমন বিশেষ এন্ট্রি সরান rm

সাবমডিউলটি অপসারণের কাজটি সম্পূর্ণ হয়ে গেলে ( deinitএবং git rm), আপনি ফোল্ডারটির পুনরায় নামটি আসল নামে রাখতে পারবেন এবং এটিকে নিয়মিত ফোল্ডার হিসাবে গিট রেপোতে যুক্ত করতে পারেন।

দ্রষ্টব্য: যদি সাবমডিউলটি কোনও পুরানো গিট দ্বারা তৈরি করা হয়েছিল (<1.8), আপনাকে .gitসাবমডিয়ুলের মধ্যেই নেস্টেড ফোল্ডারটি সরিয়ে ফেলতে হবে , সাইমন ইস্ট মন্তব্য করেছেন


আপনি submodule ইতিহাসে রাখার প্রয়োজন হয়, তাহলে দেখতে jsears এর উত্তর , যা ব্যবহার git filter-branch


5
এটি কার্যত গাছ থেকে এটি 1.8.4-এ মুছে ফেলবে (আমার পুরো সাবমডিউল দির সাফ হয়ে গেছে)।
ক্রিস ডাউন

@ ক্রিসডাউন আপনার অর্থ, deinitএকাই আপনার সাবমডিউল থেকে কার্যকরী গাছ পরিষ্কার করেছেন?
ভনসি

হ্যাঁ, এটি সাবমডিউল ডিরেক্টরিতে থাকা সমস্ত সামগ্রী মুছে ফেলে।
ক্রিস ডাউন

2
@ এমসুয়েট না, আপনি কিছু মিস করছেন না: একটি সাবমডিউলটিতে প্রথমে একটি .git নেই। যদি এটি আপনার ক্ষেত্রে হয় তবে এটি একটি নেস্টেড রেপো ছিল, সাবমডিউল নয়। এটি ব্যাখ্যা করে যে উপরে কেন এই উত্তরটি আপনার ক্ষেত্রে প্রযোজ্য হবে না। উভয়ের মধ্যে পার্থক্যের জন্য, স্ট্যাকওভারফ্লো . com/a/34410102/6309 দেখুন
ভনসি

1
@ ভনসি আমি বর্তমানে ২.৯.০. উইন্ডোজ ১. তে রয়েছি, তবে বেশ কয়েক বছর আগে গিটের পূর্ববর্তী সংস্করণে সাবমোডুলগুলি তৈরি করা হতে পারে, আমি নিশ্চিত নই। আমি মনে করি চূড়ান্ত অ্যাড + কমিট করার আগে আমি সেই ফাইলটি সরিয়ে দিচ্ছি যতক্ষণ না পদক্ষেপগুলি কাজ করবে।
সাইমন পূর্ব

67

আমি একটি স্ক্রিপ্ট তৈরি করেছি যা সমস্ত ফাইলের ইতিহাস বজায় রেখে একটি সাব ডিরেক্টরিকে একটি সাধারণ ডিরেক্টরিতে অনুবাদ করবে will git log --follow <file>অন্যান্য সমাধানগুলি যে সমস্যাগুলি ভোগ করে তা এটি ভোগ করে না । এটি একটি খুব সহজ এক-লাইন অনুরোধ যা আপনার জন্য সমস্ত কাজ করে। G'luck।

এটি লুকাস জেনির দুর্দান্ত কাজটির উপর ভিত্তি করে তৈরি করেছে, তার ব্লগ পোস্টে " প্যারেন্ট রিপোজিটরিতে একটি সাবমডিউল সংহত করে ", তবে পুরো প্রক্রিয়াটি স্বয়ংক্রিয়ভাবে পরিচালিত হয় এবং অন্যান্য কয়েকটি কোণ সাফ করে।

সর্বশেষ কোডটি https://github.com/jeremysears/scriptts/blob/master/bin/git-submodule-rewrite এ গিগাবাইটে বাগফিক্স দিয়ে বজায় রাখা হবে , তবে সঠিক স্ট্যাকওভারফ্লো উত্তর প্রোটোকলের জন্য, আমি অন্তর্ভুক্ত করেছি এর সম্পূর্ণ নীচে সমাধান।

ব্যবহার:

$ git-submodule-rewrite <submodule-name>

Git-submodule-পুনর্লিখন:

#!/usr/bin/env bash

# This script builds on the excellent work by Lucas Jenß, described in his blog
# post "Integrating a submodule into the parent repository", but automates the
# entire process and cleans up a few other corner cases.
# https://x3ro.de/2013/09/01/Integrating-a-submodule-into-the-parent-repository.html

function usage(){
  echo "Merge a submodule into a repo, retaining file history."
  echo "Usage: $0 <submodule-name>"
  echo ""
  echo "options:"
  echo "  -h, --help                Print this message"
  echo "  -v, --verbose             Display verbose output"
}

function abort {
    echo "$(tput setaf 1)$1$(tput sgr0)"
    exit 1
}

function request_confirmation {
    read -p "$(tput setaf 4)$1 (y/n) $(tput sgr0)"
    [ "$REPLY" == "y" ] || abort "Aborted!"
}

function warn() {
  cat << EOF
    This script will convert your "${sub}" git submodule into
    a simple subdirectory in the parent repository while retaining all
    contents and file history.

    The script will:
      * delete the ${sub} submodule configuration from .gitmodules and
        .git/config and commit it.
      * rewrite the entire history of the ${sub} submodule so that all
        paths are prefixed by ${path}.
        This ensures that git log will correctly follow the original file
        history.
      * merge the submodule into its parent repository and commit it.

    NOTE: This script might completely garble your repository, so PLEASE apply
    this only to a fresh clone of the repository where it does not matter if
    the repo is destroyed.  It would be wise to keep a backup clone of your
    repository, so that you can reconstitute it if need be.  You have been
    warned.  Use at your own risk.

EOF

  request_confirmation "Do you want to proceed?"
}

function git_version_lte() {
  OP_VERSION=$(printf "%03d%03d%03d%03d" $(echo "$1" | tr '.' '\n' | head -n 4))
  GIT_VERSION=$(git version)
  GIT_VERSION=$(printf "%03d%03d%03d%03d" $(echo "${GIT_VERSION#git version}" | tr '.' '\n' | head -n 4))
  echo -e "${GIT_VERSION}\n${OP_VERSION}" | sort | head -n1
  [ ${OP_VERSION} -le ${GIT_VERSION} ]
}

function main() {

  warn

  if [ "${verbose}" == "true" ]; then
    set -x
  fi

  # Remove submodule and commit
  git config -f .gitmodules --remove-section "submodule.${sub}"
  if git config -f .git/config --get "submodule.${sub}.url"; then
    git config -f .git/config --remove-section "submodule.${sub}"
  fi
  rm -rf "${path}"
  git add -A .
  git commit -m "Remove submodule ${sub}"
  rm -rf ".git/modules/${sub}"

  # Rewrite submodule history
  local tmpdir="$(mktemp -d -t submodule-rewrite-XXXXXX)"
  git clone "${url}" "${tmpdir}"
  pushd "${tmpdir}"
  local tab="$(printf '\t')"
  local filter="git ls-files -s | sed \"s/${tab}/${tab}${path}\//\" | GIT_INDEX_FILE=\${GIT_INDEX_FILE}.new git update-index --index-info && mv \${GIT_INDEX_FILE}.new \${GIT_INDEX_FILE}"
  git filter-branch --index-filter "${filter}" HEAD
  popd

  # Merge in rewritten submodule history
  git remote add "${sub}" "${tmpdir}"
  git fetch "${sub}"

  if git_version_lte 2.8.4
  then
    # Previous to git 2.9.0 the parameter would yield an error
    ALLOW_UNRELATED_HISTORIES=""
  else
    # From git 2.9.0 this parameter is required
    ALLOW_UNRELATED_HISTORIES="--allow-unrelated-histories"
  fi

  git merge -s ours --no-commit ${ALLOW_UNRELATED_HISTORIES} "${sub}/master"
  rm -rf tmpdir

  # Add submodule content
  git clone "${url}" "${path}"
  rm -rf "${path}/.git"
  git add "${path}"
  git commit -m "Merge submodule contents for ${sub}"
  git config -f .git/config --remove-section "remote.${sub}"

  set +x
  echo "$(tput setaf 2)Submodule merge complete. Push changes after review.$(tput sgr0)"
}

set -euo pipefail

declare verbose=false
while [ $# -gt 0 ]; do
    case "$1" in
        (-h|--help)
            usage
            exit 0
            ;;
        (-v|--verbose)
            verbose=true
            ;;
        (*)
            break
            ;;
    esac
    shift
done

declare sub="${1:-}"

if [ -z "${sub}" ]; then
  >&2 echo "Error: No submodule specified"
  usage
  exit 1
fi

shift

if [ -n "${1:-}" ]; then
  >&2 echo "Error: Unknown option: ${1:-}"
  usage
  exit 1
fi

if ! [ -d ".git" ]; then
  >&2 echo "Error: No git repository found.  Must be run from the root of a git repository"
  usage
  exit 1
fi

declare path="$(git config -f .gitmodules --get "submodule.${sub}.path")"
declare url="$(git config -f .gitmodules --get "submodule.${sub}.url")"

if [ -z "${path}" ]; then
  >&2 echo "Error: Submodule not found: ${sub}"
  usage
  exit 1
fi

if ! [ -d "${path}" ]; then
  >&2 echo "Error: Submodule path not found: ${path}"
  usage
  exit 1
fi

main

উবুন্টু 16.04 এ কাজ করে না। আমি গিথুব রেপোতে একটি টান অনুরোধ পাঠিয়েছি ।
qznc

1
ভাল ক্যাচ, @ কিউএনসিএন এটি ওএসএক্সে পরীক্ষা করা হয়েছিল। যখন আমি উভয় প্ল্যাটফর্মের উপর দিয়ে যায় তখন আমি আনন্দের সাথে তা একীভূত করব।
jsears 15

@qznc উবুন্টু 16.04 সমর্থন একত্রিত হয়েছে এবং উত্তর আপডেট হয়েছে।
jsears

2
এটি সেরা উত্তর, পুরো ইতিহাস রাখে। খুব সুন্দর!
চার্লসবি

1
উইন্ডোজ 10-এ গিথব থেকে সর্বশেষ সংস্করণ সহ গিটি বাশ ২.২০.১.১ এ ত্রুটি ছাড়াই সমস্ত কাজ করুন: curl https://raw.githubusercontent.com/jeremysears/scripts/master/bin/git-submodule-rewrite > git-submodule-rewrite.shএবং./git-submodule-rewrite.sh <submodule-name>
আলেক্সি

32
  1. git rm --cached the_submodule_path
  2. .gitmodulesফাইলটি থেকে সাবমডিউল বিভাগটি সরিয়ে ফেলুন , বা এটি যদি কেবলমাত্র সাবমডিউল হয় তবে ফাইলটি সরিয়ে দিন।
  3. "সরানো সাবমডিউল জাইজেড" একটি অঙ্গীকার করুন
  4. git add the_submodule_path
  5. আরেকটি প্রতিশ্রুতিবদ্ধ "xyz এর কোডবেস যুক্ত"

আমি এখনও কোন সহজ উপায় খুঁজে পাইনি। git commit -aস্বাদের বিষয়টি - আপনি এক ধাপে 3-5 সংকোচ করতে পারেন ।


6
এর .gitmodulesপরিবর্তে হওয়া উচিত নয় .submodules?
ইম্জ - ইভান জ্যাচারিয়াশেভ

1
এটি হওয়া উচিত .gitmodulesনয়.submodules
মিকি

1
সাবমডিউলের ফোল্ডারে কাজ করার .gitআগে আমাকে সাবমডিউলের ডিরেক্টরিটি সরিয়ে ফেলতে হয়েছিলgit add
কারসন ইভান্স

16

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

এই উদাহরণের জন্য মূল রেপো হবে git@site.com:main/main.gitএবং সাবমডিউল রেপো হবে git@site.com:main/child.git। এটি ধরে নিয়েছে যে সাবমডিউলটি প্যারেন্ট রেপোর মূল ডিরেক্টরিতে অবস্থিত। প্রয়োজনীয় নির্দেশাবলী সামঞ্জস্য করুন।

অভিভাবক রেপো ক্লোন করে এবং পুরানো সাবমডিউলটি সরিয়ে শুরু করুন।

git clone git@site.com:main/main.git
git submodule deinit child
git rm child
git add --all
git commit -m "remove child submodule"

এখন আমরা শিশু রেপোগুলিকে মূল রেপোতে প্রবাহিত করব।

git remote add upstream git@site.com:main/child.git
git fetch upstream
git checkout -b merge-prep upstream/master

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

mkdir child

.git ফোল্ডার ব্যতীত সমস্ত ফোল্ডার এবং ফাইলগুলি চাইল্ড ফোল্ডারে সরান।

git add --all
git commit -m "merge prep"

এখন আপনি কেবল নিজের ফাইলগুলি মাস্টার শাখায় ফিরে যেতে পারবেন।

git checkout master
git merge merge-prep # --allow-unrelated-histories merge-prep flag may be required 

চারপাশে দেখুন এবং দৌড়ানোর আগে নিশ্চিত হয়ে নিন যে সবকিছু ঠিক আছে git push

আপনাকে এখন একটি জিনিস মনে রাখতে হবে যে গিট লগটি ডিফল্টরূপে মুভ ফাইলগুলিকে অনুসরণ করে না তবে চালিয়ে git log --follow filenameআপনি আপনার ফাইলগুলির পুরো ইতিহাস দেখতে পারবেন।


2
আমি ফাইনালে উঠার সমস্ত উপায় git merge merge-prepপেয়েছি এবং ত্রুটিটি পেয়েছি fatal: refusing to merge unrelated histories। কার্যসংক্রান্ত এই হল: git merge --allow-unrelated-histories merge-prep
humblehacker

@ হুম্বলহ্যাকার ধন্যবাদ অন্যরাও যদি এর সাথে চালিত হয় তবে আমি একটি সামান্য মন্তব্য যুক্ত করেছি।
মিসচুয়েট

1
সাবমডিউলের ইতিহাস রাখার সেরা উত্তর। ধন্যবাদ @ এমসচুয়েট
আন্তন টেমচেনকো

উদাহরণস্বরূপ এখানে, আপ স্ট্রিমের ফাইলগুলি childডিরেক্টরিতে আনার কোনও উপায় আছে , সুতরাং আপনাকে পরে এগুলি সরাতে হবে না? আমার একটি সাবমডিউল এবং প্রধান রেপোতে একই ফাইলের নাম রয়েছে ... সুতরাং আমি কেবল দুটি সংযুক্তি সংঘাত পেয়েছি কারণ এটি দুটি ফাইলকে একত্রে একত্রিত করার চেষ্টা করছে।
স্কিটার্ম

সম্ভবত তবে আমি এটি অফহ্যান্ড জানি না। আমি ব্যক্তিগতভাবে শুধু একটি কমিট তাদের মধ্যে টেনে সামনে রেপো আপনি এখন তারা ডিরেক্টরি আপনি চান রক্ষিত মধ্যে সরানোর চেষ্টা করছেন ফাইল চলন্ত করতে হবে।
mschuett

12

আমাদের ক্ষেত্রে এটি ঘটেছিল যে আমরা 2 টি প্রকল্পের জন্য 2 টি ভান্ডার তৈরি করেছি যা এতগুলি মিলিত হয়েছিল যেগুলি তাদের আলাদা করার কোনও ধারণা রাখেনি, তাই আমরা সেগুলি একীভূত করেছিলাম।

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

যদি আপনি উপ-মডেলটি কাজ করে থাকেন এবং আপনি এটি করতে পারেন এমন একটি ডিরেক্টরিতে এটি রূপান্তর করতে চান:

git clone project_uri project_name

এখানে আমরা কাজ করতে একটি ক্লোন ক্লোন করি do এই প্রক্রিয়াটির জন্য আপনাকে সাবমোডিয়ালগুলি আরম্ভ করার বা আপডেট করার দরকার নেই, কেবল এটি এড়িয়ে যান।

cd project_name
vim .gitmodules

.gitmodulesআপনি যে সাবমডিউলটি প্রতিস্থাপনের পরিকল্পনা করছেন তা সরাতে আপনার প্রিয় সম্পাদক (বা ভিম) দিয়ে সম্পাদনা করুন । আপনার যে রেখাগুলি সরাতে হবে সেগুলি দেখতে এই জাতীয় দেখতে হবে:

[submodule "lib/asi-http-request"]
    path = lib/asi-http-request
    url = https://github.com/pokeb/asi-http-request.git

ফাইলটি সংরক্ষণ করার পরে,

git rm --cached directory_of_submodule
git commit -am "Removed submodule_name as submodule"
rm -rf directory_of_submodule

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

git remote add -f submodule_origin submodule_uri
git fetch submodel_origin/master

এখানে আমরা মার্জ করার জন্য সাবমডিউল সংগ্রহস্থলটি আনছি।

git merge -s ours --no-commit submodule_origin/master

এখানে আমরা 2 টি সংগ্রহস্থলের মার্জ অপারেশন শুরু করি, তবে প্রতিশ্রুতি দেওয়ার আগে থামি stop

git read-tree --prefix=directory_of_submodule/ -u submodule_origin/master

এখানে আমরা সাবমডিউলে মাস্টারের সামগ্রীটি সেই ডিরেক্টরিতে প্রেরণ করি যেখানে এটি একটি ডিরেক্টরি নামের পূর্বনির্ধারণের আগে ছিল

git commit -am "submodule_name is now part of main project"

এখানে আমরা মার্জটিতে পরিবর্তনের প্রতিশ্রুতিবদ্ধ প্রক্রিয়াটি সম্পূর্ণ করি।

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


এটি directory_of_submodule
সাব

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

আমার স্মৃতি এখন দুর্বোধ্য তবে আমি মনে করি যে আমি সাবমেরড ফাইল git log original_path_of_file_in_submoduleসত্ত্বেও ফাইলটির জন্য গিট রেপোতে নিবন্ধিত পাথ (যা এখন আর সিস্টেম সিস্টেমে আর বিদ্যমান নেই) করে একীভূত সাবমডিউল ফাইলগুলির ইতিহাস পেতে সক্ষম হয়েছি এখন থাকেনsubmodule_path/new_path_of_file
এ্যানট্রপিক

এটি ইতিহাস খুব ভাল সংরক্ষণ করে না এবং পথগুলিও ভুল। আমি মনে করি গাছের ফিল্টার জাতীয় কিছু দরকার তবে আমি আমার গভীরতার বাইরে ... আমি যা পেয়েছি তা চেষ্টা করে: x3ro.de/2013/09/01/…
এইচ

এই উত্তরটি অপ্রচলিত, stackoverflow.com/a/16162228/11343 (VonC উত্তর) একই কিন্তু ভালো করে
CharlesB


6

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

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

git clone ../main_repo main.tmp
git clone ../main_repo/sub_repo sub.tmp

পছন্দসই সাব-ডিরেক্টরিতে সমস্ত ফাইল সরানোর জন্য প্রথমে সাবরেপো সম্পাদনা করুন

cd sub.tmp
mkdir sub_repo_path
git mv `ls | grep -v sub_repo_path` sub_repo_path/
git commit -m "Moved entire subrepo into sub_repo_path"

হেডের একটি নোট তৈরি করুন

SUBREPO_HEAD=`git reflog | awk '{ print $1; exit; }'`

এখন মূল রেপো থেকে সাবরেপো সরান

cd ../main.tmp
rmdir sub_repo_path
vi .gitmodules  # remove config for submodule
git add -A
git commit -m "Removed submodule sub_repo_path in preparation for merge"

এবং অবশেষে, কেবল তাদের মার্জ করুন

git fetch ../sub.tmp
# remove --allow-unrelated-histories if using git older than 2.9.0
git merge --allow-unrelated-histories $SUBREPO_HEAD

আর হয়ে গেল! নিরাপদে এবং কোনও যাদু ছাড়াই।


... কোন উত্তর? ব্যবহারকারীর নামটি উল্লেখ করার পাশাপাশি শীর্ষ উত্তরগুলি সময়ের সাথে সাথে পরিবর্তন করতে পারে।
কনটাঙ্গো

@ কনটাঙ্গো উত্তর আপডেট হয়েছে। তবে শীর্ষের উত্তরটি এখনও 400 পয়েন্টের শীর্ষে শীর্ষ উত্তর ;-)
ডেটালেস

সাবরেপোতে ইতিমধ্যে এতে subrepoস্টাফ সহ একটি ডিরেক্টরি রয়েছে কিনা তা কাজ করে?
অবধি

শেষ ধাপে আমি নিম্নলিখিত ত্রুটি git merge $SUBREPO_HEAD fatal: refusing to merge unrelated historiesপেয়েছি : git merge $SUBREPO_HEAD --allow-unrelated-historiesএই ক্ষেত্রে আমার কি ব্যবহার করা উচিত ? বা এটি ছাড়া কাজ করা উচিত এবং আমি একটি ভুল করেছি?
টিআই-এম

1
@ টিআই-এম হ্যাঁ, এটি হ'ল দুটি ইতিহাস মার্জ করার ক্ষেত্রে যা কোনও কমিট ভাগ করে না। সম্পর্কযুক্ত ইতিহাসের বিরুদ্ধে প্রহরীটি প্রথমত এটি লেখার পর থেকে গিটকে নতুন বলে মনে হচ্ছে; আমি আমার উত্তর আপডেট করব।
ডেটালেস

3

কখন থেকে

git rm [-r] --cached submodule_path

আয়

fatal: pathspec 'emr/normalizers/' did not match any files

প্রসঙ্গ: আমি rm -r .git*আমার সাবমোডিয়াল ফোল্ডারগুলিতে বুঝতে পেরেছিলাম যে তাদের যে মূল প্রকল্পে আমি কেবল যুক্ত করেছি, সেখানে তাদের ডি-সাবমডিউল করা দরকার। কিছুটিকে ডি-সাবমডুলিং করার সময় আমি উপরের ত্রুটিটি পেয়েছি তবে সেগুলি সবই নয়। যাইহোক, আমি এগুলি চালিয়ে স্থির করেছি, (অবশ্যই, পরে rm -r .git*)

mv submodule_path submodule_path.temp
git add -A .
git commit -m "De-submodulization phase 1/2"
mv submodule_path.temp submodule_path
git add -A .
git commit -m "De-submodulization phase 2/2"

মনে রাখবেন এটি ইতিহাস সংরক্ষণ করে না।


3

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

নামক একটি ফাইলে git-integrate-submodule:

#!/usr/bin/env bash
mv "$1" "${1}_"
git submodule deinit "$1"
git rm "$1"
mv "${1}_" "$1"
git add "$1/**"

0

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


0

আমি যা পেয়েছি তা সবচেয়ে সহজ এবং সহজ।

সাবমডিউল রেপোতে, হেড থেকে আপনি প্রধান রেপোতে মার্জ করতে চান:

  • git checkout -b "mergeMe"
  • mkdir "foo/bar/myLib/" (আপনি যেখানে মূল রেপোতে ফাইলগুলি চান সেখানে অভিন্ন পথ)
  • git mv * "foo/bar/myLib/" (সমস্ত পথে সরানো)
  • git commit -m "ready to merge into main"

সাব মড্যুলটি সরিয়ে এবং "ফু / বার / মাইলিব" পথ সাফ করার পরে মূল রেপোতে ফিরে যান:

  • git merge --allow-unrelated-histories SubmoduleOriginRemote/mergeMe

বুম হয়েছে

ইতিহাস সংরক্ষণ করা

কোন চিন্তা করো না


এটি অন্যান্য কয়েকটি উত্তরের প্রায় একইরকম নোট করুন। তবে এটি ধরে নিয়েছে আপনার সাবমডিউল রেপো। এছাড়াও এটি সাবমোডিয়ুলের জন্য ভবিষ্যতের প্রবাহ পরিবর্তনগুলি সহজ করে তোলে।

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