Vivasoft-logo

১০.৮ এনভায়রনমেন্ট ভেরিয়েবল

Git সবসময় একটি bash shell এর ভিতরে চলে এবং এটি কীভাবে আচরণ করবে তা নির্ধারণ করতে বেশ কয়েকটি shell environment variable ব্যবহার করে। মাঝে মাঝে, এগুলো দিয়ে git কিভাবে চলবে তা আপনার পছন্দ মতো ব্যবহার করতে পারবেন। এখানে সবগুলো environment variable এর কোনো তালিকা দেয়া হয়নি যা Git এ ব্যবহার করা যাবে, তবে আমরা সবচেয়ে প্রয়োজনীয় বিষয়গুলো নিয়ে আলোচনা করবো।

Global Behavior

কম্পিউটার প্রোগ্রাম হিসাবে git এর কিছু সাধারণ কাজ environment variable এর উপর নির্ভর করে।

GIT_EXEC_PATH নির্ধারণ করে যে git তার সাব-প্রোগ্রামগুলো (যেমন git-commit, git-diff ইত্যাদি) কোথায় খুঁজবে। আপনি git –exec-path চালিয়ে বর্তমান সেটিংস দেখে নিতে পারেন।

HOME সাধারণত পরিবর্তনযোগ্য বলে বিবেচিত হয় না (অন্যান্য অনেক কিছুই এর উপর নির্ভর করে), তবে এটি হচ্ছে সেই জায়গা যেখানে Git global configuration ফাইলের খোঁজ করে। আপনি যদি একটি পোর্টেবল গিট ইনস্টলেশন চান, তাহলে global configuration ব্যবহার করুন এবং আপনি তখন পোর্টেবল গিট-এর শেল প্রোফাইলের হোমকে ওভাররাইড করতে পারবেন।

PREFIX অনেকটা একই রকম, তবে সিস্টেম-ব্যাপী কনফিগারেশনের জন্য এটি ব্যবহৃত হয়। গিট এই ফাইলটি $PREFIX/etc/gitconfig এ খুঁজে।

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

GIT_PAGER কমান্ড লাইনে মাল্টি লাইন আউটপুট প্রদর্শন করতে ব্যবহৃত প্রোগ্রামটিকে নিয়ন্ত্রণ করে। এটি সেট না থাকলে, PAGER একটি ফলব্যাক হিসাবে ব্যবহার করা হবে৷

GIT_EDITOR এটি Git চালু করবে যখন ব্যবহারকারীর কিছু টেক্সট এডিট করতে হবে (উদাহরণস্বরূপ একটি কমিট মেসেজ)। এটি সেট না থাকলে, EDITOR ব্যবহার করা হবে।

Repository Locations বর্তমান রিপোজিটোরির সাথে এটি কীভাবে ইন্টারফেস করে তা নির্ধারণ করতে গিট বিভিন্ন environment variables ব্যবহার করে।

GIT_DIR হল .git ফোল্ডারের অবস্থান। যদি এটি নির্দিষ্ট করা না থাকে, Git ~ বা / এ না যাওয়া পর্যন্ত ডিরেক্টরি ট্রি তে চলে যায়, প্রতিটি ধাপে একটি .git ডিরেক্টরি খুঁজতে থাকে।

GIT_CEILING_DIRECTORIES একটি .git ডিরেক্টরি সার্চিং এর আচরণ নিয়ন্ত্রণ করে। আপনি যদি ধীরে লোড হওয়া ডিরেক্টরিগুলি অ্যাক্সেস করেন (যেমন একটি টেপ ড্রাইভে, বা একটি স্লো নেটওয়ার্ক কানেকশন এর মাধ্যমে), তাহলে আপনি গিটকে আগে ভাগে চেষ্টা করা বন্ধ করাতে পারেন, বিশেষ করে যদি আপনার শেল প্রম্পট তৈরি করার সময় গিটকে ইনভোক করা হয়।

GIT_WORK_TREE হল একটি non-bare রিপোজিটরির জন্য ওয়ার্কিং ডিরেক্টরির root এর লোকেশন। যদি –git-dir বা GIT_DIR নির্দিষ্ট করা থাকে কিন্তু –work-tree, GIT_WORK_TREE বা core.worktree-এর কোনোটিই নির্দিষ্ট করা না থাকে, তাহলে বর্তমান ওয়ার্কিং ডিরেক্টরিকে আপনার ওয়ার্কিং ট্রি এর শীর্ষ স্তর হিসেবে গণ্য করা হয়।

GIT_INDEX_FILE হল ইনডেক্স ফাইলের পথ (শুধুমাত্র নন-বেয়ার রিপোজিটরি)।

GIT_OBJECT_DIRECTORY ডিরেক্টরির অবস্থান নির্দিষ্ট করতে ব্যবহার করা যেতে পারে যা সাধারণত .git/objects-এ থাকে।

GIT_ALTERNATE_OBJECT_DIRECTORIES হল একটি কোলন দিয়ে আলাদা করা তালিকা (/dir/one:/dir/two:… এর মতো ফর্ম্যাট করা) যা Git কে বলে, কোথায় অব্জেক্ট খুঁজতে হবে।

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

Pathspecs

“pathspec” বলতে বোঝায়, আপনি কীভাবে ওয়াইল্ডকার্ড ব্যবহার সহ গিটে জিনিসগুলির পাথ নির্দিষ্ট করেন। এগুলো .gitignore ফাইলে ব্যবহার করা হয়, কিন্তু কমান্ড-লাইনেও (git add *.c) ব্যবহার করা হয়।

GIT_GLOB_PATHSPECS এবং GIT_NOGLOB_PATHSPECS pathspecs এ ওয়াইল্ডকার্ডের ডিফল্ট আচরণ নিয়ন্ত্রণ করে।

GIT_GLOB_PATHSPECS 1 এ সেট করা থাকলে, ওয়াইল্ডকার্ড অক্ষর গুলো ওয়াইল্ডকার্ড হিসাবে কাজ করে (যা ডিফল্ট); যদি GIT_NOGLOB_PATHSPECS 1 তে সেট করা থাকে, ওয়াইল্ডকার্ড অক্ষরগুলি শুধুমাত্র নিজেদের মেলানোর চেষ্টা করে, যার অর্থ *.c শুধুমাত্র “\*.c” নামের ফাইলের সাথে মিলে, যে ফাইলের নাম .c দিয়ে শেষ হলে সেটা মিলায় না। আপনি পৃথক ক্ষেত্রে এটিকে ওভাররাইড করতে পারেন :(glob) বা :(আক্ষরিক), যেমন :(glob)\*.c দিয়ে pathspec শুরু করে।

GIT_LITERAL_PATHSPECS উপরের উভয় আচরণকে নিষ্ক্রিয় করে; কোন ওয়াইল্ডকার্ড অক্ষর কাজ করবে না, এবং ওভাররাইড prefix গুলোও ডিসেবল করা হয়েছে।

GIT_ICASE_PATHSPECS একটি case-insensitive পদ্ধতিতে কাজ করার জন্য সমস্ত pathspec সেট করে।

Committing

একটি গিট কমিট অবজেক্টের চূড়ান্ত সৃষ্টি সাধারণত git-commit-tree দ্বারা করা হয়, যা এই environment variables কে তথ্যের প্রাথমিক উৎস হিসাবে ব্যবহার করে, যদি এটি পাওয়া না যায় তবেই কনফিগারেশন values গুলিতে ফিরে আসে।

GIT_AUTHOR_NAME হল “author” ফিল্ডের মানুষের-পাঠযোগ্য নাম।

GIT_AUTHOR_EMAIL হল “author” ফিল্ডের ইমেল৷

GIT_AUTHOR_DATE হল “author” ফিল্ডের জন্য ব্যবহৃত টাইমস্ট্যাম্প৷

GIT_COMMITTER_NAME “committer” ফিল্ডের জন্য নাম সেট করে।

GIT_COMMITTER_EMAIL হল “committer” ফিল্ডের ইমেল ঠিকানা।

GIT_COMMITTER_DATE “committer” ফিল্ডের টাইমস্ট্যাম্পের জন্য ব্যবহার করা হয়।

user.email কনফিগারেশন মান সেট না থাকলে EMAIL হল ফলব্যাক ইমেল ঠিকানা। এটি সেট না থাকলে, গিট সিস্টেম ইউজার এবং হোস্টনেম গুলিতে ফিরে আসে।

নেটওয়ার্কিং

গিট HTTP এর মাধ্যমে নেটওয়ার্ক অপারেশন করতে curl লাইব্রেরি ব্যবহার করে, তাই GIT_CURL_VERBOSE গিটকে সেই লাইব্রেরি দ্বারা তৈরী করা সমস্ত তথ্য প্রেরণ করতে বলে। এটি কমান্ড লাইনে curl -v করার অনুরূপ।

GIT_SSL_NO_VERIFY Git কে SSL সার্টিফিকেট যাচাই না করতে বলে। আপনি যদি HTTPS-এ গিট রিপোজিটরিগুলি পরিবেশন করার জন্য একটি স্ব-স্বাক্ষরিত সার্টিফিকেট ব্যবহার করেন বা আপনি একটি গিট সার্ভার সেট আপ করার মাঝখানে থাকেন তবে এখনও একটি সম্পূর্ণ সার্টিফিকেট  ইনস্টল না করলে এটি কখনও কখনও প্রয়োজনীয় হতে পারে।

যদি একটি HTTP অপারেশনের ডেটা রেট GIT_HTTP_LOW_SPEED_TIME সেকেন্ডের বেশি সময়ের জন্য GIT_HTTP_LOW_SPEED_LIMIT বাইট প্রতি সেকেন্ডের চেয়ে কম হয়, Git সেই কার্যকলাপটি বাতিল করবে। এই মানগুলি http.lowSpeedLimit এবং http.lowSpeedTime কনফিগারেশন মানগুলিকে ওভাররাইড করে।

GIT_HTTP_USER_AGENT এর দ্বারা HTTP মাধ্যমে যোগাযোগ করার সময় Git ইউজার-এজেন্ট স্ট্রিং সেট করে। ডিফল্ট মান git/2.0.0 বা অনুরূপ।

ডিফিনিং এবং মার্জিং

GIT_DIFF_OPTS নামটি কিছুটা ভুল শোনায়। ভ্যালিড মান হল শুধুমাত্র -u<n> অথবা –unified=<n>, যা একটি git diff  কমান্ডে দেখানো কনটেক্সট লাইনের সংখ্যা নিয়ন্ত্রণ করে।

GIT_EXTERNAL_DIFF ব্যবহৃত হয় diff.external কনফিগারেশন মানের ওভাররাইড হিসাবে। যদি এটি সেট করা থাকে, গিট ডিফ চালু করা হলে গিট এই প্রোগ্রামটি চালু করবে।

GIT_DIFF_PATH_COUNTER এবং GIT_DIFF_PATH_TOTAL, GIT_EXTERNAL_DIFF বা diff.external এ নির্দিষ্ট করা প্রোগ্রামে লাগে। প্রথমটি সিরিজের কোন ফাইলটিকে ডিফ করা হচ্ছে (1 থেকে শুরু), এবং পরেরটি ব্যাচের মোট ফাইলসংখ্যা।

GIT_MERGE_VERBOSITY রিকার্সিভ মার্জের ক্ষেত্রে আউটপুট নিয়ন্ত্রণ করে। অনুমোদিত মানগুলো নিম্নরূপ:

  • 0 আউটপুট কিছুই না, সম্ভবত একটি এরর মেসেজ ছাড়া।
  • 1 শুধুমাত্র কনফ্লিক্ট দেখায়।
  • 2 ফাইল পরিবর্তনও দেখায়।
  • 3 দেখায় যখন ফাইলগুলি এড়িয়ে যায় কারণ সেগুলি পরিবর্তিত হয়নি।
  • 4 সমস্ত পাথ দেখায় যেহেতু সেগুলি প্রসেস করা হয়।
  • 5 এবং তার উপরে বিস্তারিত ডিবাগিং তথ্য দেখানো হয়। 

 

ডিফল্ট মান 2।

ডিবাগিং

সত্যিই জানতে চান GIT কি করছে? একটি মোটামুটি সম্পূর্ণ ট্রেস সেট GIT এ আছে, এবং আপনাকে শুধু সেগুলো চালু রাখতে হবে। এই রাশিগুলোর সম্ভাব্য মান নিম্নরূপ:
  • true”, “1”, বা “2” – stderr এ ট্রেস ক্যাটেগরী লিখে ।
  • ট্রেস আউটপুট / তে অবস্থিত ফাইলে লিখে ।
GIT_TRACE সাধারণ ট্রেস নিয়ন্ত্রণ করে, যা কোনো নির্দিষ্ট ক্যাটেগরীতে পড়ে না। এর মধ্যে রয়েছে উপনামের (এলিয়াস) সম্প্রসারণ এবং অন্যান্য সাব-প্রোগ্রামের প্রতিনিধি।
				
					$ GIT_TRACE=true git lga
20:12:49.877982 git.c:554               trace: exec: 'git-lga'
20:12:49.878369 run-command.c:341       trace: run_command: 'git-lga'
20:12:49.879529 git.c:282               trace: alias expansion: lga => 'log' '--graph' '--pretty=oneline' '--abbrev-commit' '--decorate' '--all'
20:12:49.879885 git.c:349               trace: built-in: git 'log' '--graph' '--pretty=oneline' '--abbrev-commit' '--decorate' '--all'
20:12:49.899217 run-command.c:341       trace: run_command: 'less'
20:12:49.899675 run-command.c:192       trace: exec: 'less'

				
			

GIT_TRACE_PACK_ACCESS প্যাকফাইল অ্যাক্সেসের ট্রেস নিয়ন্ত্রণ করে।  প্রথমটি যে প্যাকফাইল অ্যাক্সেস করা হয়েছে তা আর দ্বিতীয়টি সেই ফাইলের মধ্যে অফসেট নির্দেশ করে:

				
					$ GIT_TRACE_PACK_ACCESS=true git status
20:10:12.081397 sha1_file.c:2088        .git/objects/pack/pack-c3fa...291e.pack 12
20:10:12.081886 sha1_file.c:2088        .git/objects/pack/pack-c3fa...291e.pack 34662
20:10:12.082115 sha1_file.c:2088        .git/objects/pack/pack-c3fa...291e.pack 35175
# […]
20:10:12.087398 sha1_file.c:2088        .git/objects/pack/pack-e80e...e3d2.pack 56914983
20:10:12.087419 sha1_file.c:2088        .git/objects/pack/pack-e80e...e3d2.pack 14303666
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

				
			

GIT_TRACE_PACKET নেটওয়ার্ক অপারেশনের প্যাকেট-লেভেলে ট্রেসিং করা নিয়ন্ত্রণ করে।

				
					$ GIT_TRACE_PACKET=true git ls-remote origin
20:15:14.867043 pkt-line.c:46           packet:          git< # service=git-upload-pack
20:15:14.867071 pkt-line.c:46           packet:          git< 0000
20:15:14.867079 pkt-line.c:46           packet:          git< 97b8860c071898d9e162678ea1035a8ced2f8b1f HEAD\0multi_ack thin-pack side-band side-band-64k ofs-delta shallow no-progress include-tag multi_ack_detailed no-done symref=HEAD:refs/heads/master agent=git/2.0.4
20:15:14.867088 pkt-line.c:46           packet:          git< 0f20ae29889d61f2e93ae00fd34f1cdb53285702 refs/heads/ab/add-interactive-show-diff-func-name
20:15:14.867094 pkt-line.c:46           packet:          git< 36dc827bc9d17f80ed4f326de21247a5d1341fbc refs/heads/ah/doc-gitk-config
# […]

				
			

GIT_TRACE_PERFORMANCE পারফরমেন্স ডেটার লগ নিয়ন্ত্রণ করে। এই আউটপুটে প্রতিটি গিট-ইনভোকেশন কত সময় নিয়েছে সেটা দেখানো হয়।

				
					$ GIT_TRACE_PERFORMANCE=true git gc
20:18:19.499676 trace.c:414             performance: 0.374835000 s: git command: 'git' 'pack-refs' '--all' '--prune'
20:18:19.845585 trace.c:414             performance: 0.343020000 s: git command: 'git' 'reflog' 'expire' '--all'
Counting objects: 170994, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (43413/43413), done.
Writing objects: 100% (170994/170994), done.
Total 170994 (delta 126176), reused 170524 (delta 125706)
20:18:23.567927 trace.c:414             performance: 3.715349000 s: git command: 'git' 'pack-objects' '--keep-true-parents' '--honor-pack-keep' '--non-empty' '--all' '--reflog' '--unpack-unreachable=2.weeks.ago' '--local' '--delta-base-offset' '.git/objects/pack/.tmp-49190-pack'
20:18:23.584728 trace.c:414             performance: 0.000910000 s: git command: 'git' 'prune-packed'
20:18:23.605218 trace.c:414             performance: 0.017972000 s: git command: 'git' 'update-server-info'
20:18:23.606342 trace.c:414             performance: 3.756312000 s: git command: 'git' 'repack' '-d' '-l' '-A' '--unpack-unreachable=2.weeks.ago'
Checking connectivity: 170994, done.
20:18:25.225424 trace.c:414             performance: 1.616423000 s: git command: 'git' 'prune' '--expire' '2.weeks.ago'
20:18:25.232403 trace.c:414             performance: 0.001051000 s: git command: 'git' 'rerere' 'gc'
20:18:25.233159 trace.c:414             performance: 6.112217000 s: git command: 'git' 'gc'

				
			

GIT_TRACE_SETUP রিপোজিটরি এবং এনভায়রনমেন্ট তথ্য দেখানো নিয়ন্ত্রণ করে।

				
					$ GIT_TRACE_SETUP=true git status
20:19:47.086765 trace.c:315             setup: git_dir: .git
20:19:47.087184 trace.c:316             setup: worktree: /Users/ben/src/git
20:19:47.087191 trace.c:317             setup: cwd: /Users/ben/src/git
20:19:47.087194 trace.c:318             setup: prefix: (null)
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

				
			

বিবিধ

GIT_SSH, নির্দিষ্ট করা থাকলে যখন Git একটি SSH হোস্টের সাথে সংযোগ করার চেষ্টা করে তখন ssh এর পরিবর্তে সেটি ব্যবহার করা হয়। কমান্ডটি $GIT_SSH [username@]host [-p <port>] <command> এর অনুরূপ হয়। মনে রাখা দরকার যে ssh কীভাবে চালু করা হয় তা কাস্টমাইজ করার এটি সবচেয়ে সহজ উপায় নয়; এটি অতিরিক্ত কমান্ড-লাইন প্যারামিটারস নিবে না, তাই আপনাকে একটি র‌্যাপার স্ক্রিপ্ট লিখতে হবে এবং GIT_SSH -এ সেটা নির্দিষ্ট করতে হবে। এর জন্য ~/.ssh/config ফাইলটি ব্যবহার করা সম্ভবত বেশী সহজ।

GIT_ASKPASS হল core.askpass কনফিগারেশনের ওভাররাইড। যখনই গিট ব্যবহারকারীকে ক্রেডেনশিয়াল এর জন্য জিজ্ঞাসা করতে হয় তখনই এই প্রোগ্রামটি চালু করা হয়, যা একটি টেক্সট প্রম্পটকে কমান্ড-লাইন আর্গুমেন্ট হিসাবে নেয়, এবং এর উত্তর stdout-এ দেয়া উচিত (এই সাবসিস্টেমের আরও তথ্যের জন্য ক্রেডেনশিয়াল স্টোরেজ দেখুন)।

GIT_NAMESPACE নেমস্পেস বিশিষ্ট refs অ্যাক্সেস নিয়ন্ত্রণ করে, এবং –namespace ফ্ল্যাগ এর মতো । এটি সার্ভারের ক্ষেত্রে বেশিরভাগ উপযোগী, যেখানে আপনি একটি রিপোজিটরির একাধিক ফর্ক  সংরক্ষণ করতে চাইতে পারেন, শুধুমাত্র refs গুলিকে আলাদা রেখে।

GIT_FLUSH ব্যবহার করা যেতে পারে গিটকে জোর করে নন-বাফারড ইনপুট/আউটপুট ব্যবহার করার জন্য যখন stdout-এ ক্রমবর্ধমানভাবে লেখা হয়। 1 গিটকে প্রায়শই ফ্লাশ করে, 0 সমস্ত আউটপুটকে বাফার করে দেয়। ডিফল্ট মান (যদি এই ভ্যারিয়েবলটি সেট করা না থাকে) কার্যকলাপ এবং আউটপুট মোডের উপর নির্ভর করে বাফার করার একটি উপযুক্ত পদ্ধতি বেছে নেওয়া হয়।

GIT_REFLOG_ACTION একটা বর্ণনামূলক লিখা reflog-এ নির্দিষ্ট করতে দেয়। এখানে একটি উদাহরণ:

				
					$ GIT_REFLOG_ACTION="my action" git commit --allow-empty -m 'My message'
[master 9e3d55a] My message
$ git reflog -1
9e3d55a HEAD@{0}: my action: My message