জিআইটি: একটি নির্দিষ্ট ফোল্ডারে চেকআউট


128

আমি এর মতো কিছু ব্যবহার করতে চাই:

git checkout -- <path>/<file>

তবে আমি স্থানীয়টিকে ওভাররাইটিং না করে আমার চয়ন করা কোনও ফোল্ডারে ফাইলটি চেকআউট করতে চাই <path>/<file>

কোন ধারণা?


উত্তর:


57

অনুযায়ী কি একটি "Git রপ্তানি" (মত "SVN রপ্তানি")?

আপনি এটির git checkout-indexজন্য ব্যবহার করতে পারেন , এটি নিম্ন স্তরের কমান্ড, যদি আপনি সবকিছু রফতানি করতে চান তবে আপনি ব্যবহার করতে পারেন -a,

git checkout-index -a -f --prefix=/destination/path/

ম্যান পেজগুলি উদ্ধৃত করতে:

চূড়ান্ত "/" [প্রিফিক্সে] গুরুত্বপূর্ণ। রফতানির নামটি আক্ষরিকভাবে নির্দিষ্ট স্ট্রিংয়ের সাথে উপসর্গযুক্ত।

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

find dirname -print0 | git checkout-index --prefix=/path-to/dest/ -f -z --stdin

ম্যান পৃষ্ঠাগুলি থেকে:

স্বজ্ঞাততা এখানে লক্ষ্য নয়। পুনরাবৃত্তিযোগ্যতা।


দুর্ভাগ্যক্রমে এটি একটি খালি গিট সংগ্রহস্থল থেকে কাজ করবে না, এমনকি --প্রেফিক্স সেটটিও :-( (গিট ১.৯.১ দিয়ে পরীক্ষা করা হয়েছে)
এপিওরোস

1
যদি আপনি একটি খালি গিট সংগ্রহস্থলটির একটি শাখা / প্রতিশ্রুতি দেখতে চান তবে ব্যবহার করুনGIT_WORK_TREE=../path/to/place git checkout
এলিকোডার

4
git worktree(নীচে দেখুন) ইমো হ'ল আজকের প্রচলিত উত্তর এবং এটি এখানে যুক্ত হতে পারে।
জিক-মের্লিন

213

আরেকটি সমাধান যা কিছুটা পরিষ্কার - কেবল একটি ভিন্ন কাজের গাছ নির্দিষ্ট করুন।

আপনার হেড থেকে (সূচী নয়) নির্দিষ্ট আউট ডিরেক্টরিতে সমস্ত কিছু পরীক্ষা করে দেখার জন্য:

git --work-tree=/path/to/outputdir checkout HEAD -- .

আপনার হেড থেকে একটি নির্দিষ্ট ডিরেক্টরিতে একটি উপ-ডিরেক্টরি বা ফাইল চেকআউট করতে:

git --work-tree=/path/to/outputdir checkout HEAD -- subdirname

4
গৌণ দ্রষ্টব্য - শেল টিলডের সম্প্রসারণ না হওয়ার কারণে আপনার একটি নিখুঁত পথের প্রয়োজন --work-tree=/home/thomasg/okcopyহবে --work-tree=~/okcopy( অর্থাত্ সম্ভবত একই গিট গাছের ভিতরে বসে কোনও আপেক্ষিক পথ ব্যবহার করা খুব কার্যকর কাজ করে তবে এইভাবে পাগলামি এবং git statusরেলিহিয়ানের আউটপুট রয়েছে)
টম গুডফেলো 29:38

10
এটি পুরানো প্রতিশ্রুতিগুলির সাথেও প্রত্যাশার মতো কাজ করে (উদাঃ হেডের স্থলে একটি এসএএএল প্রদান করুন) তবে git statusএরপরে প্রচুর মোডগুলি দেখায় (সম্ভবতঃ সূচকটি এখন অন্য ডিরেক্টরিতে মেলে না তবে সাধারণ কাজের গাছের সাথে)। git resetএটি একটি ভাল অবস্থায় ফিরে পেয়েছে।
টম গুডফেলো

2
এখানে একই git statusপরিমাণে অনেকগুলি মোড দেখা যায়, এবং git resetকোনও সহায়তা করে না। আমাকে git checkout -f HEADআমার রেপোর অবস্থা পুনরুদ্ধার করতে হয়েছিল।
ডিউজুন

11
এফওয়াইআই: আপনাকে fatal: This operation must be run in a work tree
নিজেরাই

13
এটি বিপর্যয়করভাবে মূল কার্যকারী গাছের সূচকে পরিবর্তন করে, যা সাধারণত খারাপ। @ টম গুডফেলোর পরামর্শ অনুসারে, git resetমূল কার্যকারী গাছটিকে তৃপ্তিতে ফিরিয়ে আনার জন্য পর্যাপ্ত পরিমাণ রয়েছে । নিরাপদে কোনো SHA1 এ, শাখা, অথবা ট্যাগে সংগ্রহস্থলের সাব রপ্তানি করতে থাকলে প্রধান কাজ গাছ পরিবর্তন দেখতে চার্লস বেইলির কুখ্যাত git archiveসমাধান । একইভাবে, একই সাথে একাধিক শাখাকে নিরাপদে চেকআউট করতে, নতুন git worktree addসাবকম্যান্ডটি আপনার বন্ধু।
সিসিল কারি

25

একটি একক ফাইলের জন্য:

git show HEAD:abspath/to/file > file.copy

2
+1 এবং "নির্দিষ্ট পূর্ববর্তী প্রতিশ্রুতি" (HEAD এর পরিবর্তে) সম্পর্কে স্পষ্ট করে বলতে: এটি বোঝায় SHA1 IDযে এটি সহজেই পাওয়া যায় gitk। যদি কেবলমাত্র সেই ফাইলটি একটি অস্থায়ী স্থানে (যেমন showgit show 82e54378856215ef96c5db1ff1160a741b5dcd70:MyProj/proguard/mapping.txt > myproj_mapping.txt
ফেরানো হয়

19

উপরের সমাধানগুলি আমার পক্ষে কার্যকর হয়নি কারণ আমার গাছের একটি নির্দিষ্ট ট্যাগযুক্ত সংস্করণ পরীক্ষা করা দরকার। এভাবেই কীভাবে cvs exportব্যবহার করা উচিত। git checkout-indexএটি ট্যাগ যুক্তি গ্রহণ করে না, কারণ এটি সূচী থেকে ফাইলগুলি পরীক্ষা করে। git checkout <tag>কাজের গাছ নির্বিশেষে সূচি পরিবর্তন করবে, সুতরাং আমার মূল গাছটি পুনরায় সেট করতে হবে। আমার জন্য যে সমাধানটি কাজ করেছিল তা হ'ল সংগ্রহস্থলটিকে ক্লোন করা। ভাগ করা ক্লোনটি বেশ দ্রুত এবং অতিরিক্ত অতিরিক্ত জায়গা নেয় না। .gitইচ্ছা হলে ডিরেক্টরির সরানো হতে পারে।

git clone --shared --no-checkout <repository> <destination>
cd <destination>
git checkout <tag>
rm -rf .git

গিগের নতুন সংস্করণগুলিতে git clone --branch <tag>নির্দিষ্ট ট্যাগটি স্বয়ংক্রিয়ভাবে চেক আউট করতে সহায়তা করা উচিত :

git clone --shared --branch <tag> <repository> <destination>
rm -rf <destination>/.git

3
git --work-tree=/path/to/outputdir checkout <tag> -- .তোমার জন্য কাজ করিনি?
ওয়ারওয়ারিচ

1
না, তা হয় না। মূল কাজের ডিরেক্টরিতে আসল ফাইলটি অপরিবর্তিত, তবে স্টেজড সংস্করণটি হারিয়ে যায় এবং ট্যাগ থেকে সংস্করণে প্রতিস্থাপন করা হয়। এটি বিশেষত খারাপ যদি মঞ্চস্থ সংস্করণে সতর্কতার সাথে বাছাই করা পরিবর্তনগুলির সেট সেট থাকে। আমি চাই না যে রফতানি কমান্ডটি আমার সূচক, সময়কাল স্পর্শ করবে to
প্রসকি

19

আপনি যদি নিজের বৈশিষ্ট্যের অধীনে কাজ করছেন এবং মাস্টারে ফিরে চেকআউট করতে না চান, আপনি চালাতে পারেন:

cd ./myrepo

git worktree add ../myrepo_master master

git worktree remove ../myrepo_master

এটি শাখা কমিটি ../myrepo_masterসহ ডিরেক্টরি তৈরি করবে master, যেখানে আপনি কাজ চালিয়ে যেতে পারেন


1
সর্বোত্তম উত্তর - সহজ, এবং git --work-tree=/path/to/outputdir checkout HEAD -- .এটি সূচকে কিছু করতে অস্বীকার করে, কেবল নির্বাচিত শাখাকে নির্দিষ্ট স্থানে অনুলিপি করে (একটি .git ফাইল যুক্ত করে)।
রজার ডিউইক

এবং আমি কীভাবে এই পরিবর্তনটিকে পূর্বাবস্থায় ফিরিয়ে আনব?
স্কট পি।

@ স্কটপ.সুফ্ট myrepo_masterডিরেক্টরিটি সরান
nnikolay

1
এটিকে পূর্বাবস্থায় ফেলা ওয়ার্কট্রি থেকে একটি সাবকম্যান্ড:git worktree remove ../myrepo_master
মার্টিজন ড্যাশোরস্ট

8

অ্যাড্রিয়ানের জবাব "মারাত্মক: এই ক্রিয়াকলাপটি অবশ্যই একটি কাজের গাছে চালানো উচিত।" নিম্নলিখিতটি আমাদের জন্য কাজ করেছে।

git worktree add <new-dir> --no-checkout --detach
cd <new-dir>
git checkout <some-ref> -- <existing-dir>

মন্তব্য:

  • --no-checkout নতুন ওয়ার্ক্ট্রি তে কোনও কিছুই চেকআউট করবেন না।
  • --detach নতুন ওয়ার্ক্রিটের জন্য একটি নতুন শাখা তৈরি করবেন না।
  • <some-ref>যে কোনও রেফের সাথে কাজ করে, উদাহরণস্বরূপ, এটি সাথে কাজ করে HEAD~1
  • সঙ্গে পরিষ্কার git worktree prune

কীভাবে পরিষ্কার করতে হবে তার বিষয়ে মন্তব্য করার জন্য +1 - বর্তমান রেপোতে গোলমাল করতে পেরে প্রত্যেকে খুশি। শুধুমাত্র এটির কোনও পার্শ্ব-প্রতিক্রিয়া নেই।
অ্যান্ড্রু হিল

1

ছাড়াও @ hasen এর উত্তরচেকআউটে ফাইলগুলি তালিকাবদ্ধ করতে , আপনি পছন্দ মতো git ls-filesপরিবর্তে ব্যবহার করতে চাইতে পারেন find:

git ls-files -z *.txt | git checkout-index --prefix=/path-to/dest/ -f -z --stdin

সঠিকভাবে ব্যবহারের জন্য আপনাকে ধন্যবাদ -z! আপনি যে স্ক্রিপ্টটি সরবরাহ করেছেন তা বেশ ভাল
এরিক

0

আমি এটি অর্জন করতে একটি গিট ওরফে সংজ্ঞা দিয়েছি (আমি এই প্রশ্নটি পাওয়ার আগে))

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

গিট চেকটো বিকাশ করুন my / আমার_প্রজেক্ট_গিট

এই উদাহরণস্বরূপ "~ / আমার_প্রজেক্ট_জিট" ডিরেক্টরিতে বিকাশকারী শাখাটি চেকআউট করবে।

এটি অভ্যন্তরের উপ নাম কোড ~/.gitconfig:

[alias]
    checkTo = "!f(){ [ -z \"$1\" ] && echo \"Need to specify branch.\" && \
               exit 1; [ -z \"$2\" ] && echo \"Need to specify target\
               dir\" && exit 2; cDir=\"$(pwd)\"; cd \"$2\"; \
               git checkout \"$1\"; cd \"$cDir\"; };f"

0

অস্থায়ী ডিরেক্টরিতে একটি শাখা পরীক্ষা করার জন্য আমি এই উপনামটি ব্যবহার করছি:

[alias]
    cot = "!TEMP=$(mktemp -d); f() { git worktree prune && git worktree add $TEMP $1 && zsh -c \"cd $TEMP; zsh\";}; f" # checkout branch in temporary directory

ব্যবহার:

git cot mybranch

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

আপনার কাজ শেষ হয়ে গেলে ডিরেক্টরিটি মুছুন এবং চালান:

git worktree prune

এটি নতুন ওয়ার্কট্রি যুক্ত করার আগে, উলেফে স্বয়ংক্রিয়ভাবে সম্পন্ন হবে।


0

git archive branch-index | tar -x -C your-folder-on-PCঅন্য ফোল্ডারে একটি শাখা ক্লোন করতে ব্যবহার করুন । আমি মনে করি, তাহলে আপনি আপনার যে কোনও ফাইল অনুলিপি করতে পারেন

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