সংবেদনশীল ফাইল এবং গিট ইতিহাস থেকে তাদের কমিটগুলি সরান


353

আমি গিটহাবের উপরে একটি গিট প্রকল্প রাখতে চাই তবে এতে সংবেদনশীল ডেটা (ব্যবহারকারী নাম এবং পাসওয়ার্ড, / ক্যানিফিগ / ডিপ্লোই.আরবির মতো ক্যাপিস্ট্রানো) সহ কয়েকটি ফাইল রয়েছে।

আমি জানি আমি এই ফাইলের নামগুলিতে যুক্ত করতে পারি .gitignore এ যুক্ত পারি , তবে এটি গিটের মধ্যে তাদের ইতিহাস সরাবে না।

আমি /.git ডিরেক্টরিটি মুছে দিয়ে আবারও শুরু করতে চাই না।

আপনার গিট ইতিহাসে কোনও নির্দিষ্ট ফাইলের সমস্ত চিহ্ন সরিয়ে দেওয়ার কোনও উপায় আছে ?



সম্পর্কিত সহায়তা. github.com/articles/…
ট্রেভর বয়ড স্মিথ

উত্তর:


448

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


উপায়টি অতিক্রম করার সাথে সাথে এটি ঠিক করার উপায় এখানে। গিটহাব ঠিক সেই প্রশ্নের উত্তর একটি FAQ হিসাবে দিয়েছেন :

উইন্ডোজ ব্যবহারকারীদের জন্য নোট : এই কমান্ডে একক পরিবর্তে ডাবল কোট (") ব্যবহার করুন

git filter-branch --index-filter \
'git update-index --remove PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA' <introduction-revision-sha1>..HEAD
git push --force --verbose --dry-run
git push --force

2019 আপডেট করুন:

এফএকিউ এর বর্তমান কোড:

  git filter-branch --force --index-filter \
  "git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" \
  --prune-empty --tag-name-filter cat -- --all
  git push --force --verbose --dry-run
  git push --force

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

এটি ঠিক করতে, তাদের হয় হয় তাদের বিদ্যমান সংগ্রহশালাটি মুছতে হবে এবং এটি পুনরায় ক্লোন করতে হবে, বা গিট-রিবেস ম্যানপেজে "পুনরায় পুনরুদ্ধার করা" শীর্ষক নির্দেশাবলী অনুসরণ করতে হবে ।

পরামর্শ : কার্যকর করুনgit rebase --interactive


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

git commit -a --amend

এটি আপনার করা নতুন পরিবর্তনগুলির সাথে পূর্ববর্তী প্রতিশ্রুতি সংশোধন করবে, এর সাথে সম্পূর্ণ ফাইল অপসারণগুলি সহ git rm। যদি ইতিহাসে পরিবর্তনগুলি আবার ফিরে আসে তবে তবুও কোনও দূরবর্তী সংগ্রহস্থলের দিকে ঠেলাঠেলি না করে আপনি একটি ইন্টারেক্টিভ রিবেস করতে পারেন:

git rebase -i origin/master

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

$EDITOR file-to-fix
git commit -a --amend
git rebase --continue

সংবেদনশীল তথ্য সহ প্রতিটি পরিবর্তনের জন্য। অবশেষে, আপনি নিজের শাখায় ফিরে আসবেন এবং আপনি নতুন পরিবর্তনগুলি নিরাপদে ঠেলাতে পারবেন।


5
নিখুঁত বন্ধু, এটি দুর্দান্ত উত্তর। তুমি আমার দিন বাঁচাও
zzeroo

18
একক পরিবর্তে Windows এ, আপনি ডবল কোট ( ") ব্যবহার করা হবে - শুধু এক বিট যোগ করতে।
ripper234

4
এই কাজ করতে পেরেছি। অনুবাদগুলিতে হারিয়ে গেলাম। আমি এখানে কমান্ডের পরিবর্তে লিঙ্কটি ব্যবহার করেছি। এছাড়াও, উইন্ডোজ কমান্ডের শেষ হিসাবে ডাবল-কোটগুলির প্রয়োজন শেষ হয়েছে, মিগডাসের পরামর্শ অনুসারে পুরো পথ, এবং লিঙ্কটি নতুন লাইন মোড়কের সূচক হিসাবে আটকানো "\" অক্ষরগুলি সহ নয়। চূড়ান্ত কমান্ডটি দেখতে এমন কিছু লাগছিল: গিট ফিল্টার-শাখা --ফোর্স - ইন্ডেক্স-ফিল্টার "গিট আরএম - ক্যাচড --ignore-unmatch src [প্রকল্প] [ফাইল]। [এক্সট্রা]" --প্রিন-খালি --tag- নাম-ফিল্টার বিড়াল - - সমস্ত
এরিক সোয়ানসন

3
আপনার filter-branchকোডটি এবং গিথাব পৃষ্ঠায় আপনি লিঙ্ক করেছেন এর মধ্যে কিছু সুস্পষ্ট পার্থক্য রয়েছে বলে মনে হচ্ছে । যেমন তাদের তৃতীয় লাইন --prune-empty --tag-name-filter cat -- --all। সমাধানটি পরিবর্তিত হয়েছে বা আমি কিছু মিস করছি?
ভূগোলিক

2
এই সমাধানটি বেশ ভাল দেখাচ্ছে তবে আমি প্রাথমিক প্রতিশ্রুতিতে অপসারণের জন্য যদি ফাইলটি চালু করি তবে এটি কার্যকর <introduction-revision-sha1>..HEADহয় না। এটি কেবলমাত্র দ্বিতীয় প্রতিশ্রুতি থেকে ফাইলটি সরিয়ে দেয়। (আমি কিভাবে কমিটের সীমাতে প্রাথমিক প্রতিশ্রুতি অন্তর্ভুক্ত করব?) সংরক্ষণের উপায়টি এখানে উল্লেখ করা হয়েছে: কমিটের git filter-branch --force --index-filter \ 'git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA' \ --prune-empty --tag-name-filter cat -- --all
সীমাতে

91

আপনার পাসওয়ার্ড পরিবর্তন করা ভাল ধারণা, তবে আপনার রেপোর ইতিহাস থেকে পাসওয়ার্ড মুছে ফেলার প্রক্রিয়াটির জন্য, আমি বিএফজি রেপো-ক্লিনারের পরামর্শ দিচ্ছি, git-filter-branchগিট রেপো থেকে প্রাইভেট ডেটা অপসারণের জন্য পরিষ্কারভাবে তৈরি করা একটি দ্রুত, সহজ বিকল্প ।

private.txtপাসওয়ার্ড ইত্যাদির একটি ফাইল তৈরি করুন যা আপনি মুছে ফেলতে চান (প্রতি লাইনে একটি প্রবেশ) এবং তারপরে এই কমান্ডটি চালান:

$ java -jar bfg.jar  --replace-text private.txt  my-repo.git

আপনার রেপির ইতিহাসের একটি থ্রেশোল্ড আকারের (1MB ডিফল্টরূপে) অধীনে থাকা সমস্ত ফাইল স্ক্যান করা হবে এবং কোনও মিলের স্ট্রিং (এটি আপনার সর্বশেষ প্রতিশ্রুতিতে নেই) "*** সরানো ***" স্ট্রিংয়ের সাথে প্রতিস্থাপন করা হবে। তারপরে আপনি git gcমৃত ডেটা পরিষ্কার করতে ব্যবহার করতে পারেন :

$ git gc --prune=now --aggressive

বিএফজি সাধারণত চলার চেয়ে 10-50x দ্রুত git-filter-branchহয় এবং দুটি সাধারণ ব্যবহারের ক্ষেত্রে বিকল্পগুলি সরলীকৃত এবং তৈরি করা হয়:

  • ক্রেজি বড় ফাইলগুলি সরানো হচ্ছে
  • পাসওয়ার্ড, শংসাপত্র এবং অন্যান্য ব্যক্তিগত ডেটা অপসারণ করা হচ্ছে

সম্পূর্ণ প্রকাশ: আমি বিএফজি রেপো-ক্লিনার এর লেখক।


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

6
এই মুহুর্তে এটি একটি বড় জয়। একটি দম্পতি চেষ্টা করার পরে, আমি খুব ভালভাবে একটি ব্যক্তিগত রেপো থেকে সংবেদনশীল তথ্য সম্বলিত কমিটগুলি স্ট্রিপ করতে এবং জোর করে সংশোধিত ইতিহাসের সাথে রিমোট রেপো আপডেট করতে সক্ষম হয়েছি। এক পক্ষের নোটটি হ'ল আপনাকে নিশ্চিত করতে হবে যে আপনার রেপো (হেড) টিপটি কোনও সংবেদনশীল ডেটা ছাড়াই নিজেই পরিষ্কার রয়েছে কারণ এই প্রতিশ্রুতিটিকে "সুরক্ষিত" হিসাবে বিবেচনা করা হয় এবং এই সরঞ্জামটির মাধ্যমে এটি সংশোধিত হবে না। যদি তা না হয় তবে কেবল নিজেই পরিষ্কার / প্রতিস্থাপন করুন এবং git commit। অন্যথায়, বিকাশকারীর টুলবক্সে নতুন সরঞ্জামের জন্য +1 :)
ম্যাট বোরজা

1
@ হেনরিডভ আমার সাম্প্রতিক মন্তব্য অনুসারে, আপনার অনুমান হিসাবে ধারণা করা আপনার আবেদনটি ভাঙ্গা উচিত নয়, ধরে নেওয়া আপনার অ্যাপ্লিকেশনটি বর্তমানে আপনার শাখার শীর্ষে (অর্থাৎ সর্বশেষ প্রতিশ্রুতি) অবস্থিত। এই সরঞ্জামটি These are your protected commits, and so their contents will NOT be alteredআপনার প্রতিশ্রুতিবদ্ধ ইতিহাসের অন্যান্য অংশকে অনুসরণ ও সংশোধন করার সময় স্পষ্টভাবে আপনার শেষ প্রতিশ্রুতির জন্য প্রতিবেদন করবে । তবে আপনার যদি রোলব্যাকের প্রয়োজন হয় তবে হ্যাঁ আপনাকে কেবল ***REMOVED***যে প্রতিশ্রুতিতে ফিরে এসেছেন সেটির জন্য আপনাকে কেবল অনুসন্ধান করতে হবে।
ম্যাট বোরজা

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

1
এটি আসলে সঠিক উত্তর হিসাবে গ্রহণ করা উচিত। এটি বক্সে যা বলে!
গজরিস

21

যদি আপনি গিটহাবের দিকে ঠেলে থাকেন তবে জোর ধাক্কা যথেষ্ট নয়, সংগ্রহস্থলটি মুছুন বা যোগাযোগের সমর্থন করুন

এমনকি যদি আপনি এক সেকেন্ড পরে চাপ দিচ্ছেন, তবে এটি নীচে বর্ণিত হিসাবে যথেষ্ট নয়।

কর্মের একমাত্র বৈধ পাঠ্যক্রমসমূহ:

  • পাসওয়ার্ডের মতো পরিবর্তনযোগ্য শংসাপত্র কী ফাঁস হয়ে গেছে?

    • হ্যাঁ: অবিলম্বে আপনার পাসওয়ার্ডগুলি সংশোধন করুন, এবং আরও OAuth এবং API কীগুলি ব্যবহার করার কথা বিবেচনা করুন!
    • না (নগ্ন ছবি):

      • ভান্ডারটিতে সমস্ত সমস্যা জাগ্রত হলে আপনি কি যত্নশীল হন?

        • না: সংগ্রহস্থল মুছুন
        • হ্যাঁ:

          • যোগাযোগ সমর্থন
          • যদি ফাঁসটি আপনার পক্ষে খুব সমালোচিত হয় তবে আপনি কিছু ভাণ্ডার ডাউনটাইম পেতে ইচ্ছুক হচ্ছেন যাতে এটি ফাঁস হওয়ার সম্ভাবনা কম থাকে তবে আপনি উত্তর দেওয়ার জন্য গিটহাব সমর্থনের জন্য অপেক্ষা করার সময় এটিকে ব্যক্তিগত করুন

এক সেকেন্ড পরে জোর করা যথেষ্ট নয় কারণ:

  • গিটহাব দীর্ঘ সময় ধরে ঝুঁকতে থাকে।

    আপনি যদি তাদের সাথে যোগাযোগ করেন তবে গিটহাব কর্মীদের এই ধরণের ঝুঁকিপূর্ণ কমিটগুলি মুছে ফেলার ক্ষমতা নেই।

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

    ঝুঁকিপূর্ণ কমিটগুলি উভয়ের মাধ্যমে দেখা যায়:

    সেই প্রতিশ্রুতিতে উত্সটি পাওয়ার একটি সুবিধাজনক উপায় হ'ল ডাউনলোড জিপ পদ্ধতিটি ব্যবহার করুন যা কোনও রেফারেন্স গ্রহণ করতে পারে, যেমন: https://github.com/cirosantilli/myrepo/archive/SHA.zip

  • নিখোঁজ এসএইচএগুলি দ্বারা প্রাপ্ত করা সম্ভব:

    • এর সাথে API ইভেন্টগুলি তালিকাভুক্ত করা হচ্ছে type": "PushEvent"। উদ্যান খনি: https://api.github.com/users/cirosantilli/events/public ( ওয়েব্যাক মেশিন )
    • আরও সুবিধাজনকভাবে কখনও কখনও, টানা অনুরোধগুলির এসএএচএসগুলি দেখে যা সামগ্রীগুলি সরানোর চেষ্টা করেছিল
  • Http://ghtorrent.org/ এবং https://www.githubarchive.org/ এর মতো স্ক্র্যাপার রয়েছে যা নিয়মিত গিটহাব ডেটা পুল করে এবং অন্য কোথাও সংরক্ষণ করে।

    আমি প্রকৃত প্রতিশ্রুতি পৃথককে স্ক্র্যাপ করেছিলাম কিনা তা আমি খুঁজে পেলাম না এবং এটির সম্ভাবনা খুব বেশি কারণ এখানে খুব বেশি ডেটা থাকবে, তবে এটি প্রযুক্তিগতভাবে সম্ভব এবং এনএসএ এবং বন্ধুদের সম্ভবত লোকের সাথে লিঙ্কিত বা আকাঙ্ক্ষার বিষয়গুলি সংরক্ষণ করার জন্য ফিল্টার রয়েছে।

আপনি কিন্তু ঠেলাঠেলি শুধু বল পরিবর্তে সংগ্রহস্থলের মুছে ফেলেন, তাহলে করে অবিলম্বে API থেকে এমনকি অদৃশ্য এবং 404 দিন, যেমন কি https://api.github.com/repos/cirosantilli/test-dangling-delete/commits/8c08448b5fbf0f891696819f3b2b2d653f7a3824 এই কাজ এমনকি যদি আপনি একই নামের সাথে অন্য একটি সংগ্রহস্থল পুনরায় তৈরি করেন।

এটি পরীক্ষা করার জন্য, আমি একটি রেপো তৈরি করেছি: https://github.com/cirosantilli/test-dangling এবং করেছেন:

git init
git remote add origin git@github.com:cirosantilli/test-dangling.git

touch a
git add .
git commit -m 0
git push

touch b
git add .
git commit -m 1
git push

touch c
git rm b
git add .
git commit --amend --no-edit
git push -f

আরও দেখুন: গিটহাব থেকে ঝুঁকিপূর্ণ প্রতিশ্রুতিটি কীভাবে সরানো যায়?


20

আমি ডেভিড আন্ডারহিলের এই স্ক্রিপ্টটি সুপারিশ করি , আমার জন্য কবিতার মতো কাজ করেছিল।

এটি পিছনে ফেলে আসা জঞ্জাল পরিষ্কার করতে নাটাকডোর ফিল্টার-শাখা যুক্ত করে এই আদেশগুলি যুক্ত করেছে:

rm -rf .git/refs/original/
git reflog expire --all
git gc --aggressive --prune

পূর্ণ স্ক্রিপ্ট (ডেভিড আন্ডারহিলের সমস্ত ক্রেডিট)

#!/bin/bash
set -o errexit

# Author: David Underhill
# Script to permanently delete files/folders from your git repository.  To use 
# it, cd to your repository's root and then run the script with a list of paths
# you want to delete, e.g., git-delete-history path1 path2

if [ $# -eq 0 ]; then
    exit 0
fi

# make sure we're at the root of git repo
if [ ! -d .git ]; then
    echo "Error: must run this script from the root of a git repository"
    exit 1
fi

# remove all paths passed as arguments from the history of the repo
files=$@
git filter-branch --index-filter \
"git rm -rf --cached --ignore-unmatch $files" HEAD

# remove the temporary history git-filter-branch
# otherwise leaves behind for a long time
rm -rf .git/refs/original/ && \
git reflog expire --all && \
git gc --aggressive --prune

নিম্নলিখিত দুটি কমান্ড আরও ভাল কাজ করতে পারে যদি নিম্নলিখিত পরিবর্তন করা হয়:

git reflog expire --expire=now --all && \
git gc --aggressive --prune=now

1
নোট করুন যে আপনার মেয়াদোত্তীর্ণ এবং ছাঁটাইয়ের ব্যবহারটি ভুল, আপনি যদি তারিখটি নির্দিষ্ট না করেন তবে তা ছাঁটাইয়ের জন্য 2 সপ্তাহেরও বেশি পুরানো সকলের কাছে ডিফল্ট থাকে। আপনি যা চান তা সবই কমিটগুলি করুন:git gc --aggressive --prune=now
অ্যাডাম পার্কিন

@ অ্যাডাম পার্কিন আমি উত্তরটিতে কোডটি একইভাবে ছেড়ে যাচ্ছি কারণ এটি ডেভিড আন্ডারহিলের সাইটের লিপি থেকে এসেছে, আপনি সেখানে মন্তব্য করতে পারেন এবং যদি তিনি এটি পরিবর্তন করেন তবে আমি এই উত্তরটি পরিবর্তন করব যেহেতু আমি সত্যিই গিট জানি না যে আমরা হব. ছাঁটাইয়ের পূর্বে মেয়াদোত্তীর্ণ আদেশটি তা প্রভাবিত করে না?
জেসন গোয়েমাট

1
@ মারকাস আন্টারওয়াদিজিটর: এটি ধাক্কা দেওয়ার জন্য কাজ করবে না।
সর্বাধিক বীকিরচ

হতে পারে আপনার উত্তরটিতে সমস্ত কমান্ড সরিয়ে দেওয়া উচিত; এটি অনেক বেশি সামঞ্জস্যপূর্ণ এবং পৃথক পদগুলির মানসিক সংমিশ্রণের প্রয়োজন হবে না :)
অ্যান্ড্রু মাও

9

পরিষ্কার হতে: গৃহীত উত্তর সঠিক। প্রথমে চেষ্টা করে দেখুন। তবে কিছু ব্যবহারের ক্ষেত্রে এটি অযথা জটিল হতে পারে, বিশেষত যদি আপনি 'মারাত্মক: খারাপ সংশোধন - প্রিন্ট-খালি' এর মতো অসাধ্য ত্রুটির মুখোমুখি হন বা আপনার রেপোর ইতিহাস সম্পর্কে সত্যই যত্ন নেন না।

একটি বিকল্প হবে:

  1. সিডি প্রকল্পের বেস শাখায়
  2. সংবেদনশীল কোড / ফাইল সরান
  3. rm -rf .git / # আপনার কোড থেকে সমস্ত গিট তথ্য সরান
  4. গিথুব এ যান এবং আপনার ভাণ্ডার মুছুন
  5. আপনার কোডটি আপনি যেমন সাধারণভাবে চান তেমন একটি নতুন সংগ্রহশালায় ঠেকাতে এই গাইডটি অনুসরণ করুন - https://help.github.com/articles/adding-an-existing-project-to-github- using-the-command- line/

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

একে পারমাণবিক বিকল্প বলুন।


9

আপনি ব্যবহার করতে পারেন git forget-blob

ব্যবহার খুব সহজ git forget-blob file-to-forget। আপনি এখানে আরও তথ্য পেতে পারেন

https://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/

এটি আপনার ইতিহাসের সমস্ত কমিট, রিফ্লগ, ট্যাগ এবং এগুলি থেকে অদৃশ্য হয়ে যাবে

আমি প্রতিবার এবং পরে একই সমস্যায় পড়েছি এবং প্রতিবারই আমাকে এই পোস্টে এবং অন্যদের কাছে ফিরে আসতে হবে, সে কারণেই আমি প্রক্রিয়াটি স্বয়ংক্রিয়ভাবে চালিত করেছি।

স্ট্যাক ওভারফ্লো থেকে অবদানকারীদের ক্রেডিট যা আমাকে এটিকে একসাথে রাখার অনুমতি দেয়


8

উইন্ডোতে আমার সমাধান এখানে

গিট ফিল্টার-শাখা - তিনটি ফিল্টার "আরএম -f 'ফাইলডির / ফাইলের নাম" "হেড

গিট পুশ - ফোর্স

নিশ্চিত করুন যে পথটি সঠিক কিনা অন্যথায় এটি কাজ করবে না

আমি আসা করি এটা সাহায্য করবে



3

আমি আজ অবধি কয়েকবার এটি করতে হয়েছিল। নোট করুন যে এটি একবারে 1 টি ফাইলে কাজ করে।

  1. একটি ফাইল পরিবর্তন করে এমন সমস্ত কমিটের একটি তালিকা পান। নীচে এক প্রথম প্রতিশ্রুতিবদ্ধ হবে:

    git log --pretty=oneline --branches -- pathToFile

  2. ইতিহাস থেকে ফাইলটি সরাতে প্রথমে কমিট শাম 1 এবং পূর্ববর্তী কমান্ড থেকে ফাইলের পাথটি ব্যবহার করুন এবং তাদের এই আদেশটিতে পূরণ করুন:

    git filter-branch --index-filter 'git rm --cached --ignore-unmatch <path-to-file>' -- <sha1-where-the-file-was-first-added>..


3

সুতরাং, এটি দেখতে এরকম কিছু দেখাচ্ছে:

git rm --cached /config/deploy.rb
echo /config/deploy.rb >> .gitignore

গিট থেকে ট্র্যাক করা ফাইলের জন্য ক্যাশে সরান এবং সেই ফাইলটিকে .gitignoreতালিকায় যুক্ত করুন


2

আমার অ্যান্ড্রয়েড প্রজেক্টে আমার কাছে অ্যাপোস / এসসিআর / প্রধান / রেজোল / মান / ফোল্ডারে আলাদা আলাদা এক্সএমএল ফাইল হিসাবে অ্যাডমোব_কিজ.এক্সএমএল ছিল । এই সংবেদনশীল ফাইলটি সরাতে আমি স্ক্রিপ্টের নীচে ব্যবহার করেছি এবং পুরোপুরি কাজ করেছি।

git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch  app/src/main/res/values/admob_keys.xml' \
--prune-empty --tag-name-filter cat -- --all
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.