আমি যে ফাইলগুলি ট্র্যাক করতে চাই তার বাইরে আমি .git ফোল্ডারটি সঞ্চয় করতে পারি?


147

গিটটি ব্যাকআপ সিস্টেম হিসাবে ব্যবহার করার জন্য আমার কাছে একটি অস্বাভাবিক ধারণা রয়েছে। সুতরাং আসুন আমি বলি আমার একটি ডিরেক্টরি আছে। / ব্যাকআপ / মাইফাইলস এবং আমি গিটটি ব্যবহার করে এটি ব্যাক আপ করতে চাই। জিনিসগুলি পরিষ্কার রাখতে আমি মাইফাইল ফোল্ডারে একটি .git ডিরেক্টরি রাখতে চাই না, তাই আমি ভেবেছিলাম আমি ./backup/git_repos/myfiles তৈরি করতে পারি। গিট ডক্সের দিকে তাকানো থেকে, আমি এটি করার চেষ্টা করেছি:

$ cd backup/myfiles
$ mkdir ../git_repos/myfiles
$ git --git-dir=../git_repos/myfiles init
Initialized empty Git repository in backup/git_repos/myfiles/
$ git --git-dir="../git_repos/myfiles/" add foo
fatal: pathspec 'foo' did not match any files

আমি সেখানে পৌঁছে যাওয়া ত্রুটি বার্তাটি দেখতে পাচ্ছি। আমি কি ভুল করছি?


9
আপনার ব্যাকআপ আইডিয়াটির পাশাপাশি, .git ফোল্ডারটি অন্য কোথাও রেখে আপনার "ডটফাইলস" (.bashrc, .vimrc, ইত্যাদি) হোম ডিরেক্টরিতে রাখতে ব্যবহার করা যেতে পারে।
ফিলিপ

6
সর্বাধিক straighforward উত্তর: stackoverflow.com/a/19548676/170352 (কারণ পুরাতন upvotes সমাধি)
ব্রান্ডন Bertelsen

1
আপনার লেখার অ্যাক্সেস নেই বা কার্যনির্বাহী ডিরেক্টরিতে কোনও পরিবর্তন আনতে চান না (যেমন .git / ইত্যাদি যোগ করা), লিওর নীচে এই উত্তরটি (পুরানো উচ্ছ্বাসেও সমাহিত) সেরা।
কোবেজহান

1
@ ফিলিপ, যদি না আপনার ডটফাইলে সংগ্রহস্থলগুলিতে গিট সাবমডিউল থাকে। গিট কোনও বাহ্যিক কাজের গাছের সাথে সংমিশ্রণে সাবমডিউলগুলি সমর্থন করে না।
ম্যাক্সচলেপজিগ

উত্তর:


101
git --git-dir=../repo --work-tree=. add foo

এটি আপনি যা চান তা করতে পারে তবে আপনি যখনই ব্যবহার করেন এমন প্রতিটি গিট কমান্ডের সাথে আপনাকে এটি নির্দিষ্ট করতে হবে তবে অবশ্যই এটি স্তন্যপান করবে।

আপনি রপ্তানি করতে পারেন GIT_WORK_TREE=.এবং GIT_DIR=../backupএবং গীত প্রতিটি কমান্ড তাদের কুড়ান হবে। যদিও এটি কেবল শেল প্রতি একক ভাণ্ডারে কাজ করতে আপনাকে স্বাচ্ছন্দ্য দেয়।

আমি বরং .git ডিরেক্টরিটি অন্য কোথাও সিমলিংক করার বা আপনার মূল ব্যাকআপ ডিরেক্টরি থেকে .git ডিরেক্টরিতে একটি সিমলিংক তৈরি করার পরামর্শ দেব।


1
প্রতিটি কমান্ডে গিট-দির এবং ওয়ার্ক-ট্রি নির্দিষ্ট না করে এবং কোনও প্রতীকী লিঙ্ক ছাড়াই আপনি একই সংরক্ষণাগারটি করতে পারেন। আমার উত্তর দেখুন।
নিকস

একটি সিমিলিংকের ক্ষতিটি হ'ল এটি কার্য গাছের মধ্যেই বিদ্যমান এবং অন্য কোনও প্রক্রিয়া যদি কাজের গাছটি মুছে দেয় তবে আপনি এই সিমিলিংকটি হারিয়ে ফেলেছেন
জেফ

তদ্ব্যতীত, যদি ওপি তার কার্যক্ষেত্রে একটি .git উপ-ডিরেক্টরিটি না চায়, তবে সে কেন একটি সিমলিংক চাইবে?
জেফ

@ জেফ: বাণিজ্য বন্ধের জন্য। (তার ব্যাকআপের ক্ষেত্রে, তার কাজের গাছটি মুছে ফেলা তার পক্ষে অন্য কোনও
দিরের মুছা ছাড়ানোর

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

170

আপনার কেবল এটি নিশ্চিত করতে হবে যে কার্য গাছটি কোথায় রয়েছে এবং এর বিপরীতে ভান্ডারটিও জানেন।

কাজের গাছটি কোথায় রয়েছে তা সংগ্রহস্থলকে জানাতে কনফিগারেশন মানটি সেট করুন core.worktree। কাজের গাছটি এটির গিটার ডিরেক্টরিটি কোথায় তা জানতে, .git (কোনও ফোল্ডার নয়!) নামের একটি ফাইল যুক্ত করুন এবং এর মতো একটি লাইন যুক্ত করুন

gitdir: /path/to/repo.git

Git 1.7.5 থেকে init কমান্ড এর জন্য একটি অতিরিক্ত বিকল্প শিখেছে।

আপনি একটি নতুন পৃথক সংগ্রহস্থল শুরু করতে পারেন

git init --separate-git-dir /path/to/repo.git

এটি পৃথক ডিরেক্টরিতে গিট সংগ্রহস্থল আরম্ভ করবে এবং বর্তমান ডিরেক্টরিতে .git ফাইল যুক্ত করবে, যা নতুন সংগ্রহস্থলের কার্যকরী ডিরেক্টরি।

আগে 1.7.5 এ আপনাকে কিছুটা আলাদা প্যারামিটার ব্যবহার করতে হয়েছিল এবং নিজেই .git ফাইলটি যুক্ত করতে হয়েছিল।

একটি পৃথক সংগ্রহস্থল আরম্ভ করার জন্য নিম্নলিখিত কমান্ডটি কার্য-বৃক্ষকে সংগ্রহস্থলের সাথে সংযুক্ত করে:

git --git-dir=/path/to/repo.git --work-tree=. init && echo "gitdir: /path/to/repo.git" > .git

আপনার বর্তমান ডিরেক্টরিটি কার্যনির্বাহী গাছ এবং গিটটি সংগ্রহস্থলটি ব্যবহার করবে /path/to/repo.git। Init কমান্ড প্যারামিটারের core.worktreeসাথে উল্লিখিত মানটি স্বয়ংক্রিয়ভাবে সেট করবে --git-dir

এমনকি আপনি এর জন্য একটি নামও যুক্ত করতে পারেন:

[alias]
    initexternal = !"f() { git --work-tree=. --git-dir=\"$1\" init && echo \"gitdir: $1\" >> .git; }; f"

কেবলমাত্র পঠনযোগ্য কর্মক্ষম ডিরেক্টরিতে গিট সংস্করণ নিয়ন্ত্রণ ব্যবহার করুন

উপরের জ্ঞানের সাথে, আপনি লেখার অনুমতি ছাড়াই কোনও ওয়ার্কিং ডিরেক্টরিতে গিট সংস্করণ নিয়ন্ত্রণ সেট আপ করতে পারেন। আপনি যদি --git-dirপ্রতিটি গিট কমান্ড ব্যবহার করে থাকেন বা সংগ্রহস্থলের (ওয়ার্কিং ডিরেক্টরিের পরিবর্তে) প্রতিটি কমান্ড কার্যকর করেন তবে আপনি .git ফাইলটি ছেড়ে দিতে পারেন এবং তাই কার্যত ডিরেক্টরিতে কোনও ফাইল তৈরি করার দরকার নেই। আরও দেখুন Leos উত্তর


7
আপনি এটি একটি বিদ্যমান রেপোতেও করতে পারেন: .git ফোল্ডারটি যেখানেই আপনি চান সেখানে সরিয়ে দিন, .git ফাইলটি এটিতে যুক্ত করুন এবং তারপরে আপনি কেবল রেপো ব্যবহার করতে পারেন যেমন আপনি সাধারণত করেন
joachim

মনে রাখবেন যে আপনি কেবল আপনার রেপোর গোড়া থেকে গিট কমান্ড জারি করতে পারেন। সাবফোল্ডারগুলিতে গিয়ে তা বিভ্রান্ত করে! (গিটডিরের জন্য প্রদত্ত মানটি আপেক্ষিক বা নিখুঁত কিনা তা ঘটবে))
জোচিম

2
এর সমাধানটি হ'ল আসল গিট কনফিগারেশন ফাইলে 'কোর. ওয়ার্ক্রি' নির্দিষ্ট করা, যেমন ফোল্ডারের মধ্যে একটিটি আপনি .git এ দেখান।
জোছিম

2
হ্যাঁ, আমি আমার উত্তরের দ্বিতীয় বাক্যে এটাই বর্ণনা করেছি। কনফিগারেশন মান core.worktreeঅবশ্যই .git ফোল্ডারের কনফিগ ফাইলে সংরক্ষণ করা হয়, যেখানে .git ফাইলটি নির্দেশ করে points
নিকস

1
আমি আবিষ্কার করি যখন আমি এই নির্দেশাবলী ব্যবহার করি তখন রেপো তৈরি হওয়া একটি খালি সংগ্রহস্থল হয়ে যায় এবং এটি ত্রুটি দেয় fatal: core.worktree and core.bare do not make sense। দেখে মনে হচ্ছে ঠিক কনফিগারটি পরিবর্তন করা যাতে এটি সমাধান হয় না।
স্টিভেন লু

62

--separate-git-dirজন্য বিকল্প git init(এবং git clone) Git আমার সংস্করণ (উপর এই কাজ করা সম্ভব ব্যবহার করা যেতে পারে 1.7.11.3)। বিকল্পটি কার্য গাছ থেকে গিট সংগ্রহস্থলকে পৃথক করে এবং কার্য গাছের .gitমূলের মধ্যে একটি ফাইল সিস্টেম অজোনস্টিক গিট প্রতীকী লিঙ্ক (একটি ফাইলের আকারে ) তৈরি করে। আমি মনে করি ফলাফলটি নিক্সের উত্তরের মতো

git init --separate-git-dir path/to/repo.git path/to/worktree

2
+1 initনিজের জন্য একটি কমান্ড লাইন বিকল্পটি ব্যবহার করা আরও পরিষ্কার এবং পরিষ্কার দেখাচ্ছে
goncalopp

উইন্ডোতে repo.gitএটির হিডেন অ্যাট্রিবিউট সেট তৈরি করা হয়। আমি তখন নিজেই এটি পরিবর্তন। আপনি কি এটি নিরাপদ কিনা তা জানতে পেরেছেন?
পিএ

+1 হ্যাঁ গিট এই সংস্করণ 1.7.5 সংস্করণে এই কমান্ড লাইন বিকল্পটিকে ঝুঁকেছে, যা তখন উপস্থিত ছিল না (যদি আমি ঠিক মনে করি)। এই প্যারামিটারটি ব্যবহার করার পরামর্শ দেওয়ার জন্য আমি আমার উত্তর আপডেট করেছি।
নিক্স

25

আমি নিক্সের উত্তরে ব্যবহৃত ডিরেক্টরিগুলি --work-treeএবং --git-dirডিরেক্টরিগুলি বিপরীত করা সহজ বলে মনে করি :

$ cd read_only_repos
$ git --work-tree=/some/readonly/location/foo/ --git-dir=foo init
$ cd foo
$ git status
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        .file_foo
        bar
        ...

এই পদ্ধতির দুটি সুবিধা রয়েছে:

  • এটি কোনও কমান্ড-লাইন বিকল্প বা .gitফাইল থাকার প্রয়োজনটিকে সরিয়ে দেয় । আপনি কেবলমাত্র সংগ্রহস্থলের মূল থেকে শুরু করেই পরিচালনা করেন।
  • এটি কোনও ফাইল সিস্টেমের মালিকানা না থাকলেও আপনাকে সংস্করণ করার অনুমতি দেয়। গিট কেবলমাত্র সংগ্রহস্থলটিতে লিখবে।

আমি কেবলমাত্র সাবধান হয়েছি যে কোনও .gitignoreফাইল ব্যবহার না করে আপনি সম্পাদনা করুন info/exclude

এরপরে আপনি read_only_repos/fooনিজের সংগ্রহস্থলে রিমোটারিটি রিমোট হিসাবে ব্যবহার করতে পারেন এমনকি মূল ফাইলগুলি সংস্করণ নিয়ন্ত্রণে না থাকলেও।


ঠিক এটি ঠিক একই আদেশ। কেবলমাত্র তফাতটি আমি দেখতে পাচ্ছি যে আপনি - ওয়ার্ক-ট্রি এবং --git-dir আর্গুমেন্টের ক্রমটি বদলেছেন। এবং অবশ্যই আপনি ওয়ার্কিং ডিরেক্টরিতে .git ফাইলটি তৈরি করেন না কারণ এতে আপনার লেখার অ্যাক্সেস নেই। তবুও, কোনও ডিরেক্টরিতে এটির লেখার অ্যাক্সেস ছাড়াই সংস্করণ নিয়ন্ত্রণ ব্যবহার করা একটি দুর্দান্ত ব্যবহারের ক্ষেত্রে। :-)
নিক্স

3
তুমি বুঝতে পেরেছ. কীটি ওয়ার্কিং ডিরেক্টরিের বাইরে রেপো তৈরি করছে।
লিও

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

19

এটি এমন একটি ডিরেক্টরিতে নামকরণ করা প্রচলিত যা গিট সংগ্রহস্থল যা একটি '.git' এক্সটেনশন সহ অস্বাভাবিক স্থানে তার কার্যকারী গাছ রয়েছে, অনেকটা খালি সংগ্রহস্থলের মতো।

mkdir ../git_repos/myfiles.git

আপনি যদি --work-treeআরম্ভের সময় বিকল্পটি সরবরাহ করে থাকেন তবে এটি স্বয়ংক্রিয়ভাবে core.worktreeকনফিগার ভেরিয়েবল সেট আপ করতে পারে যার অর্থ গিট ডিরেক্টরিটি নির্দিষ্ট করে একবার কর্ম গাছটি কোথায় পাওয়া যাবে তা জানতে পারবে।

git --git-dir=../git_repos/myfiles.git --work-tree=. init

তবে আপনি এই পরিবর্তনশীলটি সত্যের পরেও সেট করতে পারেন।

git --git-dir=../git_repos/myfiles.git config core.worktree "$(pwd)"

একবার আপনি এটি সম্পন্ন করার পরে অ্যাড কমান্ডটি প্রত্যাশা অনুযায়ী কাজ করা উচিত।

git --git-dir=../git_repos/myfiles.git add foo

আমি খুঁজে পেয়েছি যদি আপনি প্রথমে সিড করেন ../git_repos/myfiles.git, রিয়েল ওয়ার্ক ট্রিে না গিয়ে 'গিট অ্যাড ফু' ঠিক কাজ করবে, এবং আপনাকে সমস্ত --git-dir নির্দিষ্ট করার দরকার নেই সময়.
স্টিভ ফলি

1
এটি সত্য, তবে আমি মনে করি যে বেশিরভাগ লোকেরা তাদের ভাণ্ডারগুলির পরিবর্তে তাদের কার্যকারী বৃক্ষে কাজ করার ঝোঁক রাখে। অবশ্যই, আপনি যদি কোনও বিচ্ছিন্ন কার্যকারী গাছ ব্যবহার করছেন তবে আপনি সম্ভবত কিছু 'বিশেষ' করছেন এবং সাহায্যের জন্য কিছু ম্যাক্রো ব্যবহার করতে পারেন।
সিবি বেইলি

6

রেপুর gitভিতরে ব্যবহার করুন :

cd ./backup/git_repos/myfiles
git init --bare
git config core.worktree ../myfiles
git config core.bare false

এখন থেকে, আপনি ব্যবহার করতে পারেন gitভিতরে ./backup/git_repos/myfilesডিরেক্টরির কোন এনভায়রনমেন্ট ভেরিয়েবল বা অতিরিক্ত পরামিতি সেটিং ছাড়া।


এটি সেরা উত্তরের মতো বলে মনে হচ্ছে তবে আমি warning: core.bare and core.worktree do not make senseকী বার্তাটি পেয়েছি তার অর্থ কি এটি কার্যকর হয়নি?
হ্যাজারপিজ

1
আমি এখনও কাজ মনে করি, তবে এটি ওয়ার্কট্রি সেট করার সময় খালি থাকার বিষয়ে অভিযোগ করে। এটা কেন আমি সেটিং করছি core.bareকরার falseপরে।
To1ne

আহ! এটি এখন আরও বোধগম্য হয়। তার জন্য ধন্যবাদ.
হ্যাজার্পিজ

1

আপনি কিছুটা পছন্দ করে একটি "নোডজিট" স্ক্রিপ্ট (কোনও ডট জিআইটি) তৈরি করতে পারেন

#!/bin/sh
gits=/usr/local/gits
    x=`pwd`
    testdir() {( cd $1; pwd; )}
    while [ "$x" != "/" ]; do
      y=`echo $x|sed -e "s/\//__/g"`
      if ([ -d "$gits/$y" ]); then
        export GIT_DIR="$gits/$y"
        export GIT_WORK_TREE="$x"
        if ([ "$1" = "nodinit" ]); then
          mkdir -p "$GIT_DIR"
          git init --bare; exit $?
        elif ([ "$1" = "shell" ]); then
          bash; exit $?
        else
          exec git "$@"
        fi
      fi
      x=`testdir "$x/.."`
    done

আপনি গিটের জায়গায় নোডজিট কল করতে পারেন এবং এটি গিট রেপো সন্ধান করে প্রয়োজনীয় হিসাবে চলক সেট করবে set উদাহরণস্বরূপ বলুন আপনার / usr / লোকাল / গিটস / __ হোম__ফু_উইব্বলে একটি (খালি) রেপো রয়েছে এবং আপনি / home / foo / wibbles / one এ আছেন তবে এটি সঠিক ওয়ার্কিং ডিরেক্টরি (/ home / foo / wibbles) এবং রেপো পাবেন ।

ওহ, আপনি সঠিক বার সেট সহ শেল পেতে "নোডজিট শেল" ব্যবহার করতে পারেন যাতে আপনি সাধারণ পুরানো গিট কমান্ড ব্যবহার করতে পারেন।


0

আপনার myfilesডিরেক্টরিগুলি ইতিমধ্যে বিদ্যমান রয়েছে এবং কিছু সামগ্রী রয়েছে বলে ধরে নিই , আপনি কি এটি দিয়ে বেঁচে থাকতে পারেন:

cd ~/backup
git init
git add myfiles

.gitডিরেক্টরির মধ্যে হতে হবে backupনা, myfiles


যদিও এটি আমার যা ইচ্ছা তা স্থির করে দেবে, আমি বরং মাইফাইলস ফোল্ডারটি গিটের অধীনে সঞ্চয় করব এবং অন্য কিছুই নয়।
ররি

আপনি ফাইলটি gitব্যবহার করে যে .gitignoreফাইলগুলি ট্র্যাক করতে চান তার একটি নির্বাচন রাখতে পারেন । আপনি যোগ তাহলে *এবং !myfilesএটি মাত্র ডিরেক্টরিটি ট্র্যাক করা হবে না। তবে আপনি যদি অন্য ডিরেক্টরিতে পৃথক রেপো চান তবে আপনার সমস্যা হবে ...
To1ne

0

আমি স্ক্রিপ্টগুলি দেখতে দেখতে তৈরি করি

~ / বিন / Git-স্ল্যাশ:

#!/usr/bin/sh

export GIT_DIR=/home/Version-Control/cygwin-root.git/
export GIT_WORK_TREE=/

git --git-dir=$GIT_DIR --work-tree=$GIT_WORK_TREE "$@"

exit $?

এটি --git_dir = $ GIT_DIR ব্যবহার করা বাজে।

উপরের উদাহরণটি সাইগউইন সিস্টেম ফাইলগুলিতে স্থানীয় পরিবর্তনগুলি ট্র্যাক করার জন্য।

এটির প্রয়োজন যে কোনও বড় প্রকল্পের জন্য এই জাতীয় একটি স্ক্রিপ্ট তৈরি করতে পারে - তবে / ছাড়াই /.git আমার মূল ব্যবহার।

উপরের শেল ওরফে বা ফাংশনটি তৈরি করার জন্য যথেষ্ট ছোট, যদি আপনি অপ্রয়োজনীয়তা দূর করেন।

যদি আমি এটি প্রায়শই যথেষ্ট করি তবে আমি ওয়ার্কস্পেসটিকে পুনরায় সংগ্রহের ম্যাপিংয়ে পুনরুদ্ধার করব

"Boxes, Links, and Parallel Trees: Elements of a Configuration Management System", 
in Workshop Proceedings of the Software Management Conference. 1989.

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

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