গিট একটি নির্দিষ্ট লাইন উপেক্ষা করতে পারেন?


114

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

var isPhoneGap = false;

স্পষ্টতই আমি এটি নির্মাণের সময় পরিবর্তন করেছি, তবে এই এক লাইন উপেক্ষা করার জন্য আমি কি কোনও উপায়ে গিট সেট করতে পারি বা আমাকে যেতে হবে এবং নিজের ফাইলটিতে রেখে সেভাবে উপেক্ষা করতে হবে?

আমি গিটক্স এবং টার্মিনালটি ওএসএক্স 10.6 এ ব্যবহার করছি।


@ user494461: গীত ফিল্টার উপায় এটা করতে হল: stackoverflow.com/a/16244970/520162
eckes

1
আপনি কি পরিবেশটি সনাক্ত করতে এবং একটি এনভায়োমেন্ট কনফিগারেশন ফাইল ব্যবহার করতে পারবেন না?
এক্সসুমাম

সংক্ষেপে: না, তবে আমি একটি প্রিপ্রসেসর স্ক্রিপ্ট লিখেছি যা নির্দিষ্ট মন্তব্য কোডের সন্ধান করে এবং গিট প্রকাশের আগে এটিকে সরিয়ে দেয়। এটি এখানে দেখুন: github.com/franklinchou/ahk_config/blob/master/preprocess.sh
ফ্রাঙ্কলিন

উত্তর:


103

যদি আপনার ফাইলটি নির্দিষ্ট ধরণের হয় তবে আপনি একটি বিষয়বস্তু ফিল্টার ড্রাইভার ঘোষণা করতে পারেন, যা আপনি কোনও .gitattributesফাইলে ঘোষণা করতে পারেন (" গিট অ্যাট্রিবিউটস " এর "কীওয়ার্ড সম্প্রসারণ" হিসাবে উপস্থাপিত ):

http://git-scm.com/figures/18333fig0702-tn.png

*.yourType filter=yourFilterName

(আপনি যদি চান তবে একটি নির্দিষ্ট ফাইলের জন্যও সেই ফিল্টারটি সেট করতে পারেন)

বাস্তবায়ন:

  • yourFilterName.smudge(ট্রিগার চালু git checkout) এবং

    git config --global filter.yourFilterName.smudge 'sed "s/isPhoneGap = .*/isPhoneGap = true/"'
    
  • yourFilterName.clean(চালু করা git add)

    git config --global filter.yourFilterName.clean 'sed "s/isPhoneGap = .*/isPhoneGap = false/"'
    

আপনার ফাইলটি অপরিবর্তিত প্রদর্শিত হবে git status, তবুও এটির পরীক্ষিত সংস্করণটির জন্য সঠিক মান থাকবে isPhoneGap


1
এর জন্য ধন্যবাদ. এটা কাজ পেয়েছিলাম। আপনি কীভাবে git diff or গিট স্ট্যাটাস তৈরি করতে জানেন , ফিল্টারগুলি উপেক্ষা করবেন? সুতরাং আমি এখনও কি ভিন্ন দেখতে পারেন? আমার ব্যবহারের ক্ষেত্রটি ডিবাগ লগের জন্য ... যা শেষ পর্যন্ত আমি মুছতে চাই ... @ জেথিল @ ভনসি
টিমহ ২

1
@ আইটিএমএইচ ফিল্টার যদি কাজ করে, গিট স্ট্যাটাস বা গিট ডিফ কিছু না দেখায়।
ভোনসি

1
এটি দুঃখের বিষয় জিআইটিতে সহজ সরল কোনও উপায় নেই। <filename> <Lenumber> এত সহজ হবে!
kiedysktos

22
@ কিডিস্ক্টোস লিনেনবার? লাইন নম্বর পরিবর্তন হলে কী হবে?
ভনসি

এটি দুর্দান্ত কাজ করেছে, তবে উইন্ডোজ ব্যবহারকারীরা সাবধান থাকুন, গিটকনফিগটি খুব চরিত্রের সাথে কোন চরিত্রটি ধারণ করতে চায়, তাই কিছু আধা-বহিরাগত নিয়মিত প্রকাশের চেষ্টা করার সময় আপনি সমস্যার মধ্যে পড়তে পারেন। আমি আমার সিড কলগুলি একটি পৃথক হেল্পার.শ ফাইলটিতে রেখেছি যা আমি আমার গিটকনফিগ থেকে কল করে যে sh ".git/helper.sh"কোনও প্যারামিটার দিয়ে সেড করার জন্য নিশ্চিত "$@"হয়েছি (আমি ধরে নিচ্ছি যে কেবল ফাইলপথটি পাস হয়েছে)।
ওহাল

43

তুমি ব্যবহার করতে পার

git update-index --assume-unchanged [file]

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

যখন ফাইলের পরিবর্তনগুলি গুরুত্বপূর্ণ যা আপনার এটি করতে হবে:

git update-index --no-assume-unchanged [file]

এছাড়াও, প্যারামিটারের জন্য গিট ডক আপডেট-সূচি দেখুন--[no-]assume-unchanged

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


2
যখন আমি গিট টানব তখন এটি করা কি নতুন সংস্করণটি আনবে?
সাদ রেহমান শাহ

1
@ ক্যাফিন যখন আপনি গিট টানবেন তখন আপনি সর্বশেষ সংস্করণটি নিয়েছিলেন যা কমিট হয়েছিল, আপনি ফাইলটি '--assume-unchanged' এ পরিবর্তন করার আগে এটিই শেষ।
কার্লোস

1
আমি বিশ্বাস করি --skip-worktreeবেশিরভাগ উদ্দেশ্যেই এটি একটি ভাল বিকল্প। stackoverflow.com/a/39583010/4233593
জেফ পেকেট


3
এটি নির্দিষ্ট ফাইল নয় পুরো ফাইলটির আপডেটগুলিকে উপেক্ষা করে
নিকোসাস

6

গিটেক্স আপনাকে স্বতন্ত্র লাইনগুলি প্রতিশ্রুতিবদ্ধ বা উপেক্ষা করতে দেবে (আপনি এটি ইতিমধ্যে জেনে থাকতে পারেন) তবে প্রতিবার প্রতিশ্রুতিবদ্ধ হলে আপনাকে তা করতে হবে। আমি মনে করি প্রতি ডিপ্লোয়মেন্ট টার্গেটে একটি কনফিগার ফাইল (আপনি এটি সংস্করণ করতে পারেন) এবং আপনি সার্ভারটি চালু করার জন্য কিছু রানটাইম প্যারামিটার (পছন্দ ./myserver --config=whatever.js) করা ভাল be


5

অবিরত https://stackoverflow.com/a/20574486/4935114 , @ মাইকে এমন একটি pre-commitহুক তৈরি করার প্রস্তাব দেওয়া হয়েছে যা স্টেইন্ড করাgrep ফাইলগুলিতে যে লাইনের জন্য কেউ এড়িয়ে যেতে চায়। এই লাইনগুলি মঞ্চস্থ করা হয়েছে কিনা তা হুক চেক করে। যদি তা হয় তবে এটি echoসতর্কবার্তা এবং এটি exitকোড সহ 1তাই প্রতিশ্রুতিবদ্ধ প্রক্রিয়াটি চলবে না।

@ মাইক এর উত্তরে অনুপ্রাণিত হয়ে আমি নিজেকে তার হুকের সম্ভবত একটি উন্নত সংস্করণ ব্যবহার করেছি যা স্বয়ংক্রিয়ভাবে নির্দিষ্ট পতাকাটি reset( -pপতাকা সহ) ব্যবহার করবে যা আমরা উপেক্ষা করতে চাই।

আমি নিশ্চিত নই যে এই হুক এমন পরিস্থিতির জন্য কাজ করবে যেখানে আপনার এই লাইন সহ অনেকগুলি ফাইল উপেক্ষা করা হবে, তবে এই pre-commitহুক একটি নির্দিষ্ট ফাইলে এই লাইনের পরিবর্তিত সন্ধান করবে buildVars.java। হুক স্ক্রিপ্টটি আমার মেশিনে এটি পরীক্ষা করার সময় দেখে মনে হয়েছিল।

#!/bin/sh

# this hook looks for lines with the text `var isPhoneGap = false;` in the file `buildVars.java` and it resets these lines to the previous state before staged with `reset -p`

if [[ $(git diff --no-ext-diff --cached buildVars.java | grep --count -e "var\ isPhoneGap[\ ]*=[\ ]*") -ne 0 ]]; then
    cat <<EOW
WARNING: You are attempting to commit changes which are not supposed to be commited according to this \`pre-commit\` hook
This \`pre-commit\` hook will reset all the files containing this line to it's previous state in the last commit.
EOW
    echo /$'\n'isPhoneGap$'\n'y$'\n'q | git reset -p
    # BONUS: Check if after reseting, there is no actual changes to be commited and if so, exit 1 so the commit process will abort.
    if [[ $(git diff --no-ext-diff --cached | wc -l) -eq 0 ]]; then
        echo there are no actual changes to be commited and besides the change to the variable \'isPhoneGap\' so I won\'t commit.
        exit 1
    fi
fi

ব্যাখ্যা

আমি যা করেছি তা একটি নিয়ন্ত্রণ ক্রম প্রতিধ্বনিত হয়েছিল যা isPhoneGapএকটি ইন্টারেক্টিভ resetপ্রক্রিয়া চলাকালীন রেজেক্সের জন্য অনুসন্ধান করে। কে কে এভাবে ছাপাখানা একটি ব্যবহারকারী এমুলেট /জন্য অনুসন্ধান করতে isPhoneGap, ছাপাখানা yযখন জিজ্ঞাসা যদি সে এই প্যাচ বাতিল করতে চায় এবং পরিশেষে presses qইন্টারেক্টিভ থেকে প্রস্থান করার জন্য reset

ইন্টারেক্টিভ বিপরীত প্যাচ প্রক্রিয়াটি এখানে নথিভুক্ত করা হয়েছে: https://git-scm.com/docs/git-add#git-add-patch


উল্লেখ্য: উপরে স্ক্রিপ্ট অভিমানী যে পরিবর্তনশীল interactive.singleKeyহয় false। আপনি যদি এটিতে কনফিগার করেছেন, সতর্কতার পরে ঠিক কমান্ড থেকে trueযেকোনটি সরান ।$'\n'echo


3

এইভাবে আপনি গিট ফিল্টারগুলির সাথে এটি করতে পারেন :

  1. গিটাট্রিবিউট ফাইল তৈরি / খুলুন:
    • <প্রকল্পের মূল> /। গিটটিট্রিবিউটস (রেপোতে প্রতিশ্রুতিবদ্ধ হবে)
      বা
    • <প্রকল্পের মূল> /। গিট / তথ্য / বৈশিষ্ট্য (রেপোতে প্রতিশ্রুতিবদ্ধ হবে না)
  2. ফিল্টার করা ফাইলগুলি সংজ্ঞায়িত করে একটি লাইন যুক্ত করুন:
    • *.rb filter=gitignore, অর্থাত্ gitignoreসমস্ত *.rbফাইলের নামে ফিল্টার চালান
  3. gitignoreআপনার ফিল্টারটি সংজ্ঞায়িত করুন gitconfig:
    • $ git config --global filter.gitignore.clean "sed '/#gitignore$/'d", অর্থাৎ এই লাইনগুলি মুছুন
    • $ git config --global filter.gitignore.smudge catযেমন, রেপো থেকে ফাইল টানানোর সময় কিছুই করবেন না

দ্রষ্টব্য:
অবশ্যই এটি রুবি ফাইলগুলির জন্য, যখন একটি লাইন শেষ হয় তখন #gitignoreপ্রয়োগ হয়, বিশ্বব্যাপী প্রয়োগ করা হয় ~/.gitconfig। আপনার উদ্দেশ্যে প্রয়োজন তবে এটি সংশোধন করুন।

সতর্কতা !!
এটি আপনার ওয়ার্কিং ফাইলটিকে রেপো (অবশ্যই) থেকে আলাদা রাখে। যে কোনও চেক আউট বা রিবেসিংয়ের অর্থ এই লাইনগুলি হারিয়ে যাবে! এই কৌশলটি অকার্যকর বলে মনে হতে পারে যেহেতু এই লাইনগুলি বারবার চেক আউট, রিবেস, বা টানতে হারিয়ে গেছে তবে এটি ব্যবহার করার জন্য আমার একটি নির্দিষ্ট ব্যবহারের কেস রয়েছে।

শুধু git stash save "proj1-debug" যখন ফিল্টার নিষ্ক্রিয় (ঠিক অস্থায়ীভাবে এটিকে অক্ষম gitconfigবা কিছু)। এইভাবে, আমার ডিবাগ কোডটি সর্বদা git stash applyআমার কোডের সাথে এই লাইনগুলি কখনও দুর্ঘটনাক্রমে প্রতিশ্রুতিবদ্ধ হওয়ার ভয় ছাড়াই সর্বদা 'd' হতে পারে ।

এই সমস্যাগুলি মোকাবেলার জন্য আমার একটি সম্ভাব্য ধারণা রয়েছে তবে আমি এটি অন্য কোনও সময় প্রয়োগ করার চেষ্টা করব।

গিডি ফিল্টার এবং গিটাট্রিবিউট উল্লেখ করার জন্য রুডি এবং jw013 কে ধন্যবাদ।


2

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

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


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

এটাই আমি ভেবেছিলাম। আমি গিটএক্সটেনশানগুলি ব্যবহার করছি এবং এটি ফাইলটি পরিবর্তিত হিসাবে দেখিয়ে দেবে এমনকি আলাদা ফলকটি ফাঁকা। সম্ভবত ফাইল ক্লিন-ইন হওয়া পর্যন্ত ক্লিন ফিল্টার চালিত হয় না বলে সম্ভবত। সম্ভবত এটি এমএসজিজিট, গিট-গিট নয় because
আইডি কে

1

আমি অনুমান করছি যে এটি এমন কিছু হতে পারে যা আপনার উত্সের একাধিক লাইনে উঠে আসে।

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

এটি আপনাকে স্থানীয়ভাবে প্রিপ্রেসেসর ম্যাক্রোগুলি টিউন করার অনুমতি দিতে পারে (বা জাভা এর জন্য https://stackoverflow.com/a/1813873/1270965 এর মতো )।


-1

নাঃ। .Gitignore এ থাকা লাইনগুলি ফাইলের নামের সাথে মেলে এবং ফাইলের সামগ্রীর সাথে নয় বলে আপনি কেবল পৃথক ফাইল (এবং আরও) উপেক্ষা করতে পারেন। আপনি এর সমাধানটি ইতিমধ্যে উল্লেখ করেছেন, অর্থাত্ এমন একটি একক ফাইলকে উপেক্ষা করুন যা আপনাকে উপেক্ষা করতে চান এমন সামগ্রী রয়েছে।


আমি সম্মত হই, আমার ক্ষেত্রে এটি উপেক্ষা করা ফাইল থেকে কেবল সেই বিষয়বস্তু অন্তর্ভুক্ত করা যথেষ্ট এবং সম্ভব ছিল। তাই সমস্ত অজানা সেটিংস মুভিং। আছে। এছাড়াও, আমি সেই উপেক্ষা করা ফাইলটির একটি অনুলিপি তৈরি করেছি এবং এটি সূচীতে সূত্র হিসাবে যুক্ত করেছি, সুতরাং সেই ফাইলটিতে কী থাকতে হবে তার তথ্য হারাবে না।
উর্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.