গিট এবং হার্ড লিঙ্কগুলি


98

ভেবে দেখা গেল যে গিটটি প্রতীকী লিঙ্কগুলিকে স্বীকৃত নয় যেগুলি সংগ্রহস্থলের বাইরে রয়েছে, হার্ড লিঙ্কগুলি ব্যবহার করতে কোনও সমস্যা আছে?

গিট তাদের ভেঙে দিতে পারে? আপনি কি আমাকে বিস্তারিত তথ্যের দিকে নির্দেশ করতে পারেন?


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

4
গিটটি প্রতিলিপিগুলির বাইরের কোনও পথের দিকে নির্দেশিত এমন সিমলিংকগুলি সনাক্ত করবে।
মিপাদি

কোনও মিপাডি নয়, একমাত্র উপায় রেপোগুলিতে ফাইলগুলি সজ্জিত করছে এবং তাদের "আসল" অবস্থানটিতে সিম্জবোলিক লিঙ্কগুলি রয়েছে
আলফ্রেডো পালহারেস

উত্তর:


89

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

গিট ফাইলগুলিকে স্পর্শ না করার চেষ্টা করে যা এটি আপডেট করার দরকার নেই, তবে আপনার মনে রাখতে হবে যে গিট হার্ডলিঙ্কগুলি সংরক্ষণ করার চেষ্টা করে না, তাই সেগুলি গিট দ্বারা ভেঙে যেতে পারে।


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


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

@ মিপাডি: বিটিডাব্লু আধুনিক গিটওয়েব সংগ্রহস্থলের বাইরে সাধারণীকরণের পরে নেতৃত্বাধীন সিমলিঙ্কগুলি প্রদর্শনের জন্য বিশেষ ক্ষেত্রে রয়েছে।
জাকুব নরবস্কি

6
হ্যাঁ, রেপোর বাইরে সিমলিংকগুলি ভাল। আমি এগুলি একটি বৃহত ডেটা ডিরেক্টরিতে নির্দেশ করতে ব্যবহার করেছি যা আমার সংস্করণযুক্ত নয় (বা চাই)। সাধারণত আমি আপেক্ষিক লিঙ্কগুলি ব্যবহার করি। সুতরাং ক্ষেত্রে ক্ষেত্রে রেপো এবং ডেটা ডিরেক্টরি কিছু অভিভাবক ডিরেক্টরিতে একে অপরের পাশে বসে থাকতে হয়েছিল। আপনি ../foo এর প্রতিলিপি দিয়ে আশ্চর্যজনক কৌশলগুলি করতে পারেন।
অ্যাড্রিয়ান রত্নপালা

দুর্ভাগ্যক্রমে, মেটাস্টোরের জন্য গিট সংগ্রহস্থল (git: //git.hardeman.nu/metastore.git) আর উপলভ্য নয়।
ডেরেক মাহর

4
github.com/danny0838/git-store-meta গিট-ক্যাশে- মেটার বিকল্প ।
ডেরেক মাহর

22

আমি জানতে পেরেছি যে, হুক ব্যবহার করে আপনি git pullইভেন্টটি ক্যাপচার করতে পারেন (যখন টানানোর জন্য কিছু আছে ...) স্ক্রিপ্ট ইভেন্ট হ্যান্ডলারটি .git/hooks/post-mergeফাইল করতে পারেন।

প্রথমত, আপনি chmod +xএটি করতে হবে।

তারপরে, lnপ্রতিটি টানে শক্ত লিঙ্কগুলি পুনরায় তৈরি করতে কমান্ডগুলি এর ভিতরে রাখুন। ঝরঝরে!

এটি কাজ করে, আমার প্রকল্পটির জন্য আমার কেবল এটির প্রয়োজন ছিল এবং ls -iদেখায় যে ফাইলগুলি পরে স্বয়ংক্রিয়ভাবে লিঙ্ক হয়েছিল pull


আমার উদাহরণ .git/hooks/post-merge:

#!/bin/sh
ln -f $GIT_DIR/../apresentacao/apresentacao.pdf $GIT_DIR/../capa/apresentacao.pdf
ln -f $GIT_DIR/../avaliacoesMono/avaliacao_monografias_2011_Nilo.pdf $GIT_DIR/../capa/avaliacoes.pdf
ln -f $GIT_DIR/../posters/poster_Nilo_sci.pdf $GIT_DIR/../capa/poster.pdf
ln -f $GIT_DIR/../monografia/monografia_Nilo.pdf $GIT_DIR/../capa/monografia_Nilo.pdf

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

এছাড়াও গুরুত্বপূর্ণ: -fপ্রয়োজনীয়, কারণ আপনি গন্তব্য ফাইলটি পুনরায় তৈরি করছেন।

সম্পাদনা

আধুনিক গিট ক্লায়েন্ট মনে হয় স্বাভাবিকভাবেই রিপোজিটরির অভ্যন্তরে সিমলিংক এবং হার্ডলিঙ্কগুলি সমর্থন করে, এমনকি কোনও দূরবর্তী অবস্থানের দিকে ধাক্কা দেওয়ার পরেও সেখান থেকে ক্লোনিং করে। গিট রেপোর বাইরে লিঙ্ক করার আমার আর দরকার ছিল না যদিও ...

$ mkdir tmp
$ cd tmp
$ git --version
git version 2.24.3 (Apple Git-128)
$ git init .
Initialized empty Git repository in /Users/teixeira/tmp/.git/
$ mkdir x
$ cd x
$ echo 123 > original
$ cat original
123
$ cd ..
$ ln -s x/original symlink
$ cat symlink
123
$ ln x/original hardlink
$ cat hardlink
123
$ git add .
$ git commit -m 'Symlink and hardlink commit'
[master (root-commit) 8df3134] Symlink and hardlink commit
 3 files changed, 3 insertions(+)
 create mode 100644 hardlink
 create mode 120000 symlink
 create mode 100644 x/original

স্থানীয় গিট সংগ্রহস্থল থেকে ক্লোনিং

$ cd
$ git clone tmp/ teste_tmp
Cloning into 'teste_tmp'...
done.
$ cd teste_tmp/
$ ls
hardlink  symlink  x
$ cat symlink
123
$ cat hardlink
123

দূরবর্তী সংগ্রহস্থল থেকে ক্লোনিং

$ cd ~/tmp
$ git remote add origin https://github.com/myUser/myRepo.git
$ git push origin master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (5/5), 361 bytes | 361.00 KiB/s, done.
Total 5 (delta 0), reused 0 (delta 0)
To https://github.com/myUser/myRepo.git
 + 964dfce...8df3134 master -> master
$ cd ../
$ git clone https://github.com/myUser/myRepo.git
Cloning into 'myRepo'...
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 5 (delta 0), reused 5 (delta 0), pack-reused 0
Unpacking objects: 100% (5/5), done.
$ cd myRepo/
$ cat symlink
123
$ cat hardlink
123

https://github.com/mokacoding/symlinks এছাড়াও একটি গুরুত্বপূর্ণ বিষয় নির্দেশ করে: প্রতীকগুলি অবশ্যই তুলনামূলকভাবে সংজ্ঞায়িত করা উচিত।


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

চালাক দৃষ্টিভঙ্গি, তবে দুর্ভাগ্যজনক যে গিট হার্ড লিঙ্কগুলি ট্র্যাক করে না, এমনকি ফাইল লিস্টগুলিতে অনুলিপি হিসাবে শক্তিশালী লিঙ্কগুলিকে সমর্থন করে না এমনগুলি সম্ভবত তাদের প্রতিনিধিত্ব করে।
ডেরেক মাহর

4
উত্তর দিতে 7 বছর সময় নেওয়ার জন্য @ হোবস দুঃখিত: আপনি ঠিক বলেছেন যদি সংগ্রহস্থলের বাইরের কোনও ফাইল 2 টি ভিন্ন রেপো দ্বারা সংযুক্ত করা হয়, তবে আমি মনে করি একটি রেপোতে একটি লিঙ্ক পরিবর্তন করা অন্যটিতে দেখা যাবে না।
নিলোকট

8

এই এমএসজিগিত ইস্যু থেকে

জংশন পয়েন্টগুলি প্রতীকী লিঙ্ক নয়; অতএব, প্রতীকী লিঙ্কগুলি কেবল এমএসজিগিতে অসমর্থিত।

এছাড়াও, হার্ড লিঙ্কগুলি কখনও গিট দ্বারা ট্র্যাক করা যায়নি

ইস্যুটি উইন্ডো-ভিত্তিক ছিল (যেহেতু এটি এমএসজিগিট সম্পর্কিত) এবং সিমিলিংকের সম্ভাব্য সমর্থন সম্পর্কে বিতর্ক।
তবে হার্ড লিঙ্ক সম্পর্কে মন্তব্য গিটকে সাধারণভাবে উদ্বেগ দেয়।


2

গুগল 'গিট হার্ড লিঙ্কগুলি সংরক্ষণ করে' এবং এটি দেখায় যে গিট কীভাবে হার্ড লিঙ্কের কাঠামোটি আফাইককে সংরক্ষণ করতে পারে তা সম্ভবত ডিজাইনের মাধ্যমে জানে না।

আমার ওয়েব প্রকল্পগুলি নিম্নরূপে হার্ড লিঙ্কগুলি ব্যবহার করে:

www/products/index.php
www/products/dell_latitude_id577/index.php #(hard linked to above)
www/products/dell_inspiron_id323/index.php #(hard linked again to above)

me@server:www/products$ ls -l index.php
-rwxr-xr-x 3 me me 1958 Aug 22 22:10 index.php*

যদি আমি সূচি.এফপিতে পরিবর্তন করতে চাইতাম তবে আমি এটিকে এক জায়গায় পরিবর্তন করেছি এবং হার্ড লিঙ্কগুলি (পণ্যের বিবরণ পৃষ্ঠাগুলি) পরিবর্তনের দিকে ইঙ্গিত করে - ব্যতীত অন্যান্য কম্পিউটারগুলিতে ক্লোনিং এবং টান দেওয়ার সময় গিট এই সম্পর্কটিকে সংরক্ষণ করে না।

me@server:www$ git pull

অন্য একটি মেশিনে প্রতিটি হার্ড লিঙ্কের জন্য একটি নতুন সূচি.এফপি তৈরি করবে।


7
আপনার ওয়েব অ্যাপে আপনাকে কোনও ধরণের রাউটিং বাস্তবায়ন করা উচিত। হার্ড লিঙ্কিং উদ্ভট।
এখনকার

4
হ্যাঁ, কমপক্ষে সিমলিংক ব্যবহার করুন। :)
আন্দ্রেস রিফ্রিও

4
এটি আসলে আমি যা চাই তা চাই, হার্ড লিঙ্কগুলি সংরক্ষণের জন্য গিটটি চাই না। আমার একটি জেনকিনস ডিরেক্টরি রয়েছে যা অনেকগুলি ওয়ার্কস্পেস ডিরেক্টরি সহ রয়েছে এবং মাল্টব্র্যাঞ্চ পাইপলাইনের কারণে অনেকগুলি সদৃশ রয়েছে। তাই আমি একটি রাত্রিকালীন কাজ আছে রানে যে hardlink --ignore-timeউপর /var/lib/jenkins, কিছু ডিস্ক স্থান পুনরায় দাবি করার। দিনের বেলা কিছু ফাইল আবার অযৌক্তিকভাবে যুক্ত হয় git pullবা পরে mvn compileতবে এটি ঠিক আছে, আমি আশা করি এটি ঘটবে। যদি গিটটি হার্ড লিঙ্কগুলি সংরক্ষণ করে তবে আমার ডিস্ক স্পেস পুনর্ব্যবহার করার কৌশলটি কাজ করবে না।
আমেদী ভ্যান গ্যাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.