একটি বিদ্যমান ফোল্ডারে "গিট ক্লোন" করার সেরা অনুশীলন কোনটি?


479

আমার কাছে কোনও উত্স নিয়ন্ত্রণ মেটা ডেটা ছাড়াই প্রকল্পের একটি ওয়ার্কিং কপি রয়েছে copy এখন, আমি এই ফোল্ডারে গিট-ক্লোন সমতুল্য করতে এবং আমার স্থানীয় পরিবর্তনগুলি রাখতে চাই।

গিট-ক্লোনটি আমাকে একটি বিদ্যমান ফোল্ডারে ক্লোন করতে দেয় না। এখানে সেরা অনুশীলন কি?


4
আরও ভাল আলোচনা এখানে
cdunn2001

1
@MEM আমি এই উত্তর আরো ভালো, কিন্তু হয় কাজ ... stackoverflow.com/a/5377989/11236
ripper234

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

1
এটি এতটাই পাগল যে এটি অর্জনের কোনও পরিষ্কার উপায় নেই, আপনি যখন মাউন্ট করা শেয়ার ফোল্ডারে কোনও প্রজেট ক্লোন করতে চান তখন এত কার্যকর।
টমাস ডেকাউস

উত্তর:


557

এটি একটি নতুন ডিরেক্টরিতে ক্লোন করে, তারপর .gitডিরেক্টরিটি আপনার বিদ্যমান ডিরেক্টরিতে স্থানান্তরিত করে করা যেতে পারে ।

যদি আপনার বিদ্যমান ডিরেক্টরিটির নাম দেওয়া হয় "কোড"।

git clone https://myrepo.com/git.git temp
mv temp/.git code/.git
rm -rf temp

ক্লোন কমান্ড চলাকালীন চেকআউট না করেও এটি করা যেতে পারে; আরও তথ্য এখানে পাওয়া যাবে


25
মনে রাখবেন যে @ ক্রিস জোনসনের ঠিক এই পরামর্শটি তিনি মন্তব্যে রেখেছিলেন। আমি এটি দরকারী খুঁজে পেয়েছি এবং এটি একটি আসল উত্তর করতে চাই। ক্রিস, আপনি যদি উত্তরটি দিয়ে থাকেন তবে আমি আনন্দের সাথে এটি মুছে ফেলব।
amicitas

2
ধন্যবাদ! যদিও এটি "গিট চেকআউট -" এর মতো একটি পদক্ষেপ মিস করছে। যেহেতু এটি মনে করে সমস্ত ফাইল মুছে ফেলা হয়েছে, তাই না?
মুরুনি

2
না, যতক্ষণ আপনি git cloneপ্রথম কমান্ড হিসাবে ব্যবহার করবেন ততক্ষণ আর কোনও চেকআউট কমান্ডের প্রয়োজন হবে না। আপনি যদি পরিবর্তে git clone --no-checkoutসেই প্রথম ধাপে কিছু ব্যবহার করেন তবে .git ডিরেক্টরিটি সরানোর পরে git reset HEADফাইলটি মুছে ফেলা হয়নি বলে গিটকে বলার প্রয়োজন হবে ।
amicitas

3
আমি এটি তৃতীয় পদক্ষেপ হিসাবে যুক্ত করব: এমভি টেম্প / .গ্রিটাইনোর কোড / .গ্রিটাইনোর
ড্যানিয়েল

1
কল্পেশনি, হ্যাঁ গিট পরিবর্তিত ফাইলগুলি সম্পর্কে জানবে এবং সাধারণ গিট কমান্ড যেমন ব্যবহার করে পরিবর্তনগুলি দেখা সম্ভব হবে git status
amicitas

284

ক্লোন করবেন না, পরিবর্তে আনুন। রেপোতে:

git init
git remote add origin $url_of_clone_source
git fetch origin
git checkout -b master --track origin/master # origin/master is clone's default

তারপরে আপনি যে প্রতিশ্রুতি চান তা পেতে গাছটিকে পুনরায় সেট করতে পারেন:

git reset origin/master # or whatever commit you think is proper...

এবং আপনি ক্লোন ক্লোন মত।

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


7
আমি এর ভক্ত নই - প্রতি গিথুব সেটআপ "টিপ: শংসাপত্রের সাহায্যকারী কেবল তখনই কাজ করে যখন আপনি এইচটিটিপিএস সংগ্রহস্থল URL টি ক্লোন করবেন।" আমি শংসাপত্র সহায়ক ব্যবহার করছিলাম এবং এটি আমাকে একটি দীর্ঘ, মোটামুটি ফলহীন খরগোশের গর্তটি নামিয়ে দিয়েছে।
অ্যান্ড্রু

5
'গিট চেকআউট - ট্র্যাক উত্স / মাস্টার' 'গিট চেকআউট-বি মাস্টার - ট্র্যাক উত্স / মাস্টার' এর পরিবর্তে ভাল কাজ করে। পুনরায় সেট করার দরকার নেই।
felipecrp

1
আমি ত্রুটিটি পেয়ে যাচ্ছিলাম "গিট ত্রুটি: নিম্নলিখিত অবিরত কর্মক্ষম গাছগুলির ফাইলগুলি চেকআউট দ্বারা ওভাররাইট করা হবে", তাই আমি এই আদেশটি যুক্ত করছি: git clean -d -fx ""
শাকান

1
অবশ্যই সব পরিস্থিতিতে পরামর্শ দেওয়া উচিত নয়, তবে এটি আমার প্রয়োজন ঠিক তাই।
চেইম এলিয়াহ

1
@ আন্ড্রেসক্রে আপনার মূল উত্তরটি (যা আমি সম্পাদনার ইতিহাসে দেখতে গিয়েছিলাম) প্রশ্নটি (এবং আমার) যা প্রয়োজন তা ঠিক করে দেয়। -F ব্যবহার না করে চেকআউটে পরিবর্তিত উত্তর বার্ফগুলি, যা স্থানীয় পরিবর্তনগুলি বাতিল করে দেয় এবং ঠিক আমি যা চাই না তা হ'ল । আমি যদি আপনি হয়ে থাকি তবে আমি আপনার মূল উত্তরে ফিরে যেতে চাই।
আজান

77

একটি বিদ্যমান ডিরেক্টরিতে মাস্টার শাখাটি চেকআউট করার জন্য নিম্নলিখিতগুলি আমি করেছি:

git init
git remote add origin [my-repo]
git fetch
git checkout origin/master -ft

2
এটি দুর্দান্ত উত্তর এবং কোনও ফাইল সিস্টেমের ফাইনালিং এড়ানো হয়।
ব্যবহারকারী 151841

1
এটি হ্যাক না হওয়ার কারণে এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
php_nub_qq

5
আসলে এটি ওপি (এবং আমি) যা চায় না ঠিক তা করে , যা স্থানীয় পরিবর্তনগুলি ওভাররাইট করা।
আজান

আমার আপভোটটি ইঙ্গিত দেয় যে এটি আমাকে সাহায্য করেছে, এটি ওপি-র প্রশ্নের সেরা উত্তর নয়।
TecBrat

2
-tপতাকাটি এখানে কেন ব্যবহৃত হচ্ছে তা কেউ ব্যাখ্যা করতে পারেন ?
jfowkes 20

38

আমি git cloneএকটি নতুন ডিরেক্টরি করতে চাই এবং বিদ্যমান ডিরেক্টরিটির সামগ্রীটি নতুন ক্লোনটিতে অনুলিপি করব।


4
যদি আপনি এটি করেন তবে নিশ্চিত হয়ে নিন যে আপনি খুব সাবধানতার সাথে প্রতিশ্রুতি দেওয়ার আগে পৃথকটি পর্যালোচনা করেছেন - এটি একটি নিখুঁত ক্লাসিক কেস যেখানে আপনি ঘটনাক্রমে উত্স রেপোতে যখনই আপনার কাজের অনুলিপি পেয়েছেন তখন থেকেই পরিবর্তনগুলি ফিরিয়ে দিতে পারবেন - কারণ পর্যাপ্ত তথ্য নেই ওয়ার্ক কপিতে, পরিবর্তনগুলি শুরু করার আগে বনাম কী পরিবর্তন হয়েছিল তা নির্ধারণ করার জন্য, রেপোতে তৈরি অন্যান্য পরিবর্তনের সাথে একত্রীকরণের জন্য copy আমি এই পরিস্থিতিতে সময় এবং সময় আবার ঘটতে দেখেছি যেখানে আমি নিজেকে এবং লোকেদের সাথে কাজ করার থেকে "দৃ "়ভাবে নিরুৎসাহিত" হয়েছি।
বেন ক্লিফোর্ড

71
git clone wherever tmp && git mv tmp/.git . && rm -rf tmpঅন্য কথায়, .gitঅস্থায়ী ক্লোন থেকে দির সরিয়ে নেওয়া ক্লোনটির কার্যকরী গাছ পরিষ্কার করা এবং বিদ্যমান ফাইলগুলি অনুলিপি করার চেয়ে সহজ বলে মনে হয়।
ক্রিস জনসন

1
@ChrisJohnsen: আপনি কি এটিকে একটি উত্তর মধ্যে তৈরি করা উচিত ছিল, যে স্পষ্টভাবে এটি এই প্রোগ্রামটিতে করতে এটি সর্বোত্তম উপায়
স্টেফানো

2
@ ক্রিস জোনসেন আমার জন্য git mv tmp/.git .ফিরেছেন fatal: cannot move directory over file, source=tmp/.git, destination=.git। কেউ কি জানেন যে বিষয়টি কী?
ডেনিস

6
@ ডেনিস, এটি একটি টাইপো: সেই আদেশটি সরল হওয়া উচিত mv, নয় git mv; যদিও এটি আপনার কাছে .gitইতিমধ্যে সেখানে কোনও ফাইল রয়েছে তা ব্যাখ্যা করে না ( gitdir: some/path/to/a/git-dirএকটি "গিটফিল" রয়েছে; এটি যদি না থাকত তবে আপনি fatal: Not a git repository (or any of the parent directories): .gitপরিবর্তে দেখতে পেতেন )।
ক্রিস জনসেন

34

একটি অস্থায়ী ডিরেক্টরি ব্যবহার করা ভাল, তবে আপনি যদি এই পদক্ষেপটি এড়াতে চান তবে এটি কাজ করবে। আপনার কার্যক্ষম ডিরেক্টরিটির মূল থেকে:

$ rm -fr .git
$ git init
$ git remote add origin your-git-url
$ git fetch
$ git reset --mixed origin/master

20
git reset --hard origin/masterযে কোনও স্থানীয় ফাইল সরিয়ে ফেলবে।
মওদ ড্যাব্বর

1
ইতিমধ্যে উপরে উল্লিখিত বিষয়গুলিতে যুক্ত করতে, এর মধ্যে পার্থক্য hardএবং mixedএটি হ'ল মিশ্রটি স্থানীয় পরিবর্তনগুলি বজায় রাখবে (সুতরাং পরে যদি আপনি এটি টানার চেষ্টা করেন তবে আপনাকে প্রদর্শন করবে উদাহরণস্বরূপ পুনর্বাসনের সাহায্যে টানতে পারবেন না: দয়া করে প্রতিশ্রুতিবদ্ধ বা সংশোধন করুন ) , যখন হার্ড সেই স্থানীয় পরিবর্তনগুলি বাতিল করবে
এক্সেল

আপনি দূরবর্তী থেকে ভুল বানান করেছেন।
গ্লেন ডেটন

10
git clone your_repo tmp && mv tmp/.git . && rm -rf tmp && git reset --mixed

7
ব্যবহারের git reset --hardফলে স্থানীয় ফাইলের পরিবর্তনগুলি কমে যাবে, বিশেষত এই ওপি যা অনুরোধ করেছিল তা নয়। --mixedপরিবর্তে ব্যবহার করা উচিত।
কালেব

4

একটি খালি বিদ্যমান ডিরেক্টরিতে গিট রেপো ক্লোন করতে নিম্নলিখিতগুলি করুন:

cd myfolder
git clone https://myrepo.com/git.git . 

.আপনার git cloneকমান্ডের শেষে লক্ষ্য করুন । এটি বর্তমান কার্যকারী ডিরেক্টরিতে রেপো ডাউনলোড করবে।


4
fatal: destination path '.' already exists and is not an empty directory.
রোল্যান্ড কোফলার 11

ডিরেক্টরিটি অবশ্যই খালি থাকতে হবে।
OkTalk

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

এটি কেবল তখনই কাজ করে যখন আপনি নতুন ডিরেক্টরি তৈরি করেন, "গিট থ্রি" ব্যবহার না করে উপরের কমান্ডগুলি চালান
বিলাল আহমেদ

3

ওপি যেভাবে জিজ্ঞাসা করেছিল সেভাবে ইতিমধ্যে এটি করার জন্য প্রচুর উত্তর। তবে এটি লক্ষণীয় যে এটিকে চারপাশে বিপরীতভাবে করা খুব সহজ:

git clone repo-url tmp/
cp -R working/ tmp/

আপনার কাছে এখন কাঙ্ক্ষিত লক্ষ্যবস্তু রয়েছে - তাজা ক্লোন + স্থানীয়-পরিবর্তন।


2

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

mv $dir $dir.orig
git clone $url $dir
rsync -av --delete --exclude '.git' $dir.orig/ $dir/
rm -rf $dir.orig

এই মুহুর্তে আপনার বর্তমান ওয়ার্কিং ডিরেক্টরি হিসাবে আপনার পূর্ববর্তী ওয়ার্কিং ফোল্ডারের সাথে একটি পরিষ্কার পরিচ্ছন্ন ওয়ার্কিং কপি থাকা উচিত যাতে আপনি চালনা করলে ফাইল মুছে ফেলার অন্তর্ভুক্ত কোনও পরিবর্তনই রাডারে প্রদর্শিত হবে git status

অন্যদিকে যদি আপনার অবশ্যই অন্যভাবে এটি করা হয় তবে আপনি এরকম কিছু দিয়ে একই ফলাফল পেতে পারেন:

cd $dir
git clone --no-checkout $url tempdir
mv tempdir/.git .
rmdir tempdir
git reset --mixed HEAD

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

* উভয় উদাহরণই ধরে নিচ্ছে যে আপনি আপনার প্রকল্পের মূল ডিরেক্টরিতে শেলটি শুরু করবেন।


2

আমি যে সমস্ত পদ্ধতিতে এসেছি সেগুলির মধ্যে এটিই সেরা

existing-dirখালি অস্থায়ী ডিরেক্টরিতে কেবল সঞ্চয়স্থানের .git ফোল্ডারটি (ফাইলগুলি ইতিমধ্যে রয়েছে সেগুলি বাদ দিয়ে ) ক্লোন করুন

  1. git clone --no-checkout repo-path-to-clone existing-dir/existing-dir.tmp // স্থানীয় রেপো ক্লোনিংয়ের জন্য --no-হার্ডলিঙ্কগুলি চাইবে

ফাইল সহ ডিরেক্টরিতে .git ফোল্ডারটি সরান। এটি existing-dirএকটি গিট রেপো তৈরি করে।

  1. mv existing-dir/existing-dir.tmp/.git existing-dir/

অস্থায়ী ডিরেক্টরি মুছুন

  1. rmdir existing-dir/existing-dir.tmp

  2. cd existing-dir

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

সতর্কতা: ফাইলগুলিতে স্থানীয় পরিবর্তনগুলি হারিয়ে যাবে।

  1. git reset --mixed HEAD

1
হার্ড রিসেটটি 99% ক্ষেত্রে অযাচিত মনে হয় যেখানে আপনার এটি করা দরকার।
স্টিফান ফ্যাবিয়ান

0

অন্তত Git 1.7.7 (যা শেখানো ব্যবহার করে থাকেন বিকল্প) হল এমন একটি কাজের কপি মধ্যে বর্তমান ডিরেক্টরী চালু করতে:clone--config

git clone example.com/my.git ./.git --mirror --config core.bare=false

এটি এর দ্বারা কাজ করে:

  • একটি নতুন .gitফোল্ডারে ভাণ্ডার ক্লোনিং করা হচ্ছে
  • --mirrorনতুন ক্লোনটিকে .gitপ্রয়োজন মতো খাঁটি মেটাডেটা ফোল্ডারে পরিণত করে makes
  • --config core.bare=falseবিকল্পটির অন্তর্নিহিত পাল্টা bare=trueদাবি করে --mirror, যার ফলে সংগ্রহস্থলকে একটি সম্পর্কিত ডিরেক্টরি থাকতে পারে এবং সাধারণ ক্লোনটির মতো কাজ করতে পারে

আপনি সম্ভবত .gitএকটি কাজের অনুলিপিতে রূপান্তর করতে চান এমন ডিরেক্টরিটিতে মেটাডেটা ডিরেক্টরি ইতিমধ্যে উপস্থিত থাকলে এটি স্পষ্টতই কাজ করবে না ।


1
মনে রাখবেন, এই কৌশল পরিণাম ডেকে আনবে [core]উভয় সহ স্থানীয় কনফিগ বিভাগে bare = true এবং bare = false । আরও সমস্যাযুক্ত এটি হ'ল এটির originরিমোটের জন্য ভুল মান রয়েছে , [remote "origin"]সহ বিভাগটি mirror = trueএবং একটি আনতে হবে যা ওয়ার্কিং কপির সাথে সঠিকভাবে কাজ করবে না। এই সমস্যাগুলি সমাধানের পরে, সাধারণত ক্লোনিং করা এবং নতুন কার্যকরী অনুলিপিটি সরিয়ে নেওয়া .gitআরও কার্যকর হবে।
অ্যারেক্সিয়া

0

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

এই পদ্ধতির সুবিধা হ'ল আপনি README বা .gitignore সহ প্রাথমিক ভান্ডারগুলির কোনও কিছুই মিস করবেন না।

পদক্ষেপগুলি শেষ করতে আপনি নীচের কমান্ডটি ব্যবহার করতে পারেন:

$ git clone https://github.com/your_repo.git && mv existing_folder/* your_repo

0

আপনি নিম্নলিখিত কমান্ড লাইনগুলি পুনরাবৃত্তভাবে টাইপ করে এটি করতে পারেন:

mkdir temp_dir   //  Create new temporary dicetory named temp_dir
git clone https://www...........git temp_dir // Clone your git repo inside it
mv temp_dir/* existing_dir // Move the recently cloned repo content from the temp_dir to your existing_dir
rm -rf temp_dir // Remove the created temporary directory

0

শুধু ব্যবহার করুন। git cloneকমান্ডের শেষে (সেই ডিরেক্টরিতে থাকা) এর মতো:

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