গিটে টান দরকার কিনা তা পরীক্ষা করুন


622

দূরবর্তী সংগ্রহস্থল বদলেছে এবং আমাকে টানতে হবে কিনা তা আমি কীভাবে পরীক্ষা করব?

এখন আমি এই সহজ স্ক্রিপ্ট ব্যবহার:

git pull --dry-run | grep -q -v 'Already up-to-date.' && changed=1

এটা বরং ভারী।

একটি ভাল উপায় আছে কি? আদর্শ সমাধানটি সমস্ত প্রত্যন্ত শাখা পরীক্ষা করে এবং পরিবর্তিত শাখাগুলির নাম এবং প্রত্যেকটিতে নতুন কমিটের সংখ্যা ফেরত দেয়।


14
দয়া করে মনে রাখবেন: "গিট টান - ড্রাই ড্রাই" সম্ভবত প্রত্যাশার মতো কাজ করে না। দেখে মনে হচ্ছে, গিট টান গিট আনতে সরাসরি অজানা বিকল্পগুলি পাস করে। ফলাফলটি একটি সাধারণ গিট টান।

27
"আনুন" এবং "মার্জ" করার একবারে "টানুন" কেবলমাত্র একটি সামান্য উপায়, আপনার যদি রিমোট রেপো স্থিতি পরীক্ষা করতে হয় তবে আপনি সত্যিই "আনতে" অনুকরণ করছেন। git fetch -v --dry-runআপনার যা প্রয়োজন তাই ।
ক্লোদিও ফ্লোরানি

উত্তর:


857

git remote updateআপনার রিমোট রেফগুলি আপ টু ডেট আনতে প্রথম ব্যবহার করুন । তারপরে আপনি কয়েকটি বিষয়গুলির মধ্যে একটি করতে পারেন, যেমন:

  1. git status -unoআপনাকে যে শাখাটি ট্র্যাক করা হচ্ছে তা এগিয়ে, পিছনে বা ডাইভার্ট হয়েছে কিনা তা আপনাকে জানাবে। যদি এটি কিছুই না বলে তবে স্থানীয় এবং দূরবর্তী একই।

  2. git show-branch *masterযাদের নামগুলি 'মাস্টার' (যেমন মাস্টার এবং উত্স / মাস্টার ) এ শেষ হয় সেই সমস্ত শাখায় আপনাকে কমিটগুলি দেখায় ।

আপনি যদি ( ) এর -vসাথে ব্যবহার করেন তবে দেখতে পাবেন কোন শাখাগুলি আপডেট হয়েছে, সুতরাং আপনার আর কোনও আদেশের দরকার নেই।git remote updategit remote -v update

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

আপনি যে কোনও রেফ ব্যবহার করে প্রতিশ্রুতিবদ্ধ আইডি পেতে পারেন git rev-parse <ref>, তাই আপনি মাস্টার এবং উত্স / মাস্টার এর জন্য এটি করতে এবং তাদের তুলনা করতে পারেন। যদি তারা সমান হয় তবে শাখাগুলি সমান। যদি তারা অসম হয় তবে আপনি জানতে চান যে অন্যটির চেয়ে এগিয়ে। ব্যবহার git merge-base master origin/masterআপনাকে উভয় শাখার সাধারণ পূর্বপুরুষকে জানিয়ে দেবে, এবং যদি তারা সরানো না হয় তবে এটি এক বা অন্যটির মতো হবে। আপনি যদি তিনটি পৃথক আইডি পান তবে শাখাগুলি অন্যদিকে চলে গেছে।

এটি সঠিকভাবে করতে, যেমন কোনও স্ক্রিপ্টে, আপনাকে বর্তমান শাখা এবং এটি ট্র্যাক করছে এমন দূরবর্তী শাখাটি উল্লেখ করতে সক্ষম হওয়া দরকার। বাশ প্রম্পট-সেটিং ফাংশনে /etc/bash_completion.dশাখার নাম পাওয়ার জন্য কিছু দরকারী কোড রয়েছে। তবে সম্ভবত আপনার নামগুলি পাওয়ার দরকার নেই। শাখাগুলি এবং কমিটস (যেমন ডকুমেন্টেড হিসাবে git rev-parse --help) উল্লেখ করার জন্য গিটের কিছু ঝরঝরে শর্টহ্যান্ড রয়েছে । বিশেষত, আপনি @বর্তমান শাখার জন্য (ধরে নিচ্ছেন যে আপনি কোনও বিচ্ছিন্ন-মাথা অবস্থায় রয়েছেন না) এবং @{u}এর উজানের শাখার জন্য (উদাহরণস্বরূপ origin/master) ব্যবহার করতে পারেন। সুতরাং git merge-base @ @{u}বর্তমান শাখা এবং এর উজানে প্রসারিত হওয়া (হ্যাশ এর) প্রতিশ্রুতি ফিরিয়ে দেবে git rev-parse @এবং git rev-parse @{u}আপনাকে দুটি টিপসের হ্যাশ দেবে। এটি নিম্নলিখিত স্ক্রিপ্টে সংক্ষিপ্তসারিত করা যেতে পারে:

#!/bin/sh

UPSTREAM=${1:-'@{u}'}
LOCAL=$(git rev-parse @)
REMOTE=$(git rev-parse "$UPSTREAM")
BASE=$(git merge-base @ "$UPSTREAM")

if [ $LOCAL = $REMOTE ]; then
    echo "Up-to-date"
elif [ $LOCAL = $BASE ]; then
    echo "Need to pull"
elif [ $REMOTE = $BASE ]; then
    echo "Need to push"
else
    echo "Diverged"
fi

দ্রষ্টব্য: গিটের পুরানো সংস্করণগুলি @নিজে থেকে অনুমতি দেয় না , সুতরাং এর @{0}পরিবর্তে আপনাকে ব্যবহার করতে হতে পারে ।

লাইনটি UPSTREAM=${1:-'@{u}'}আপনাকে বৈকল্পিকভাবে একটি প্রবাহ শাখাটি স্পষ্টভাবে পাস করার অনুমতি দেয়, আপনি যদি বর্তমান শাখার জন্য কনফিগার করা চেয়ে আলাদা কোনও দূরবর্তী শাখার বিরুদ্ধে পরীক্ষা করতে চান তবে। এটি সাধারণত ফর্মের দূরবর্তী নাম / শাখার নাম হতে পারে । যদি কোনও প্যারামিটার দেওয়া না হয় তবে মানটি ডিফল্ট হয় @{u}

স্ক্রিপ্টটি ধরে নিয়েছে যে আপনি ট্র্যাকিং শাখাগুলি আধুনিক করে তুলতে একটি git fetchবা git remote updateপ্রথম কাজ করেছেন । আমি এটি স্ক্রিপ্টে তৈরি করিনি কারণ এনে আনতে এবং তুলনা করতে পৃথক ক্রিয়াকলাপ হিসাবে এটি আরও নমনীয়, উদাহরণস্বরূপ আপনি যদি আনয়ন ছাড়াই তুলনা করতে চান কারণ আপনি ইতিমধ্যে সম্প্রতি নিয়ে এসেছেন।


4
@ টাকেশিন, আমি অনুমান করি যে আপনি গিট এলএস-রিমোট অরিজিন -h রেফ / হেড / মাস্টার একত্রিত করতে পারবেন যেমন @ ব্রোল গিট রেভ-তালিকা - ম্যাক্স-কাউন্ট = 1 উত্স / মাস্টার সহ পরামর্শ দিয়েছেন। যদি তারা একই হ্যাশটি ফিরে আসে তবে আপনি সর্বশেষে আপনার রিমোট রেফগুলি আপডেট করার পরে দূরত্বের শাখাটি পরিবর্তিত হয়নি (টান, আনুন, দূরবর্তী আপডেট ইত্যাদি) এতে আপনার সুবিধা হবে যে আপনার সামগ্রীর সামগ্রীটি টানতে হবে না সমস্ত প্রতিশ্রুতি এখনই, কিন্তু এটি আরও সুবিধাজনক সময়ের জন্য ছেড়ে যেতে পারে। তবে, যেহেতু রিমোট আপডেটটি অ-ধ্বংসাত্মক, তাই আপনি সম্ভবত এটি করতে পারেন।
নিল মেহেহে

2
আপনি চেষ্টাও করতে পারেন git status -s -u no, যা এর চেয়ে কম আউটপুট দেয় git status -u no
ফিলিপ মেঘ

2
@mhulse git remote -v update,। git remote --helpপূর্ণাঙ্গ ব্যাখ্যার জন্য আউটপুটটি দেখুন ।
নীল মেহেহে

1
@ ক্রিসমাস ভালো পয়েন্ট গিটের পুরানো সংস্করণগুলির সাথে আরও সুস্পষ্ট বাক্য গঠন প্রয়োজন। আমার কাছে থাকা বিভিন্ন সিস্টেমে আমি পরীক্ষা করে দেখেছি যে @{u}1.8.3.2 গিট দিয়ে কাজ @করে তবে তা হয় না। তবে @কাজ করে 1.8.5.4। গল্পটির নৈতিকতা: গিটটি উন্নতি করে চলেছে এবং এটি আপনি করতে পারেন এমন সাম্প্রতিকতম সংস্করণটি মূল্যবান।
নিল মেহেহে

1
@ এর জন্য এখন একটি নির্দিষ্টকারকের প্রয়োজন। আপনি @ এর পরিবর্তে @ {0 use ব্যবহার করতে পারেন।
বেন ডেভিস

132

আপনার যদি একটি উজানের শাখা থাকে

git fetch <remote>
git status

আপনার যদি উজানের শাখা না থাকে

দুটি শাখা তুলনা করুন:

git fetch <remote>
git log <local_branch_name>..<remote_branch_name> --oneline

উদাহরণ স্বরূপ:

git fetch origin

# See if there are any incoming changes
git log HEAD..origin/master --oneline

(আমি ধরে নিচ্ছি যে origin/masterএটি আপনার দূরবর্তী ট্র্যাকিং শাখা)

যদি কোনও কমিটগুলি উপরের আউটপুটটিতে তালিকাভুক্ত হয় তবে আপনার আগত পরিবর্তনগুলি রয়েছে - আপনার মার্জ করতে হবে। যদি কোনও কমিট তালিকাভুক্ত না হয় git logতবে মার্জ করার মতো কিছুই নেই।

মনে রাখবেন যে আপনি কোনও বৈশিষ্ট্য শাখায় থাকলেও এটি কাজ করবে - এতে কোনও ট্র্যাকিং রিমোট নেই, কারণ যদি গিটের দ্বারা স্মরণ করা উজানের শাখাটি স্পষ্টভাবে উল্লেখ না origin/masterকরে ।


2
এমনকি git fetch; git log HEAD.. --onelineস্থানীয় একটির জন্য কোনও ডিফল্ট দূরবর্তী শাখা থাকলেও একটি সংক্ষিপ্ত স্বরলিপি ব্যবহার করা যেতে পারে।
ফিল পিরোজকভ

@ ফিলিপিরোজভকভ আপনার যদি একটি ডিফল্ট দূরবর্তী শাখা থাকে তবে একটি সহজ "গিট স্ট্যাটাস" আমার উচিত মনে করা উচিত। আমার উত্তরটি যে কোনও দুটি শাখার জন্য জেনেরিক ছিল, যেখানে অন্যটি অন্যটিকে ট্র্যাক করতে পারে বা নাও পারে।
প্লেগহ্যামার

55
git rev-list HEAD...origin/master --countদুজনের মধ্যে আপনাকে "বিভিন্ন" কমিটের মোট সংখ্যা দেবে।
জ্যাক বার্গার

1
সংক্ষিপ্ত এবং সহজ আমার প্রিয় সমাধানটি যা কেবলমাত্র নতুন
কমিটগুলি

আমি কীভাবে এটি একটি (উবুন্টু) ব্যাচের ফাইলে ব্যবহার করতে পারি, যাতে এই কমান্ডটি দেখায় যে একটি টান প্রয়োজন?
ইউলিসেস আলভেস

69

এটি যদি কোনও স্ক্রিপ্টের জন্য হয় তবে আপনি ব্যবহার করতে পারেন:

git fetch
$(git rev-parse HEAD) == $(git rev-parse @{u})

(দ্রষ্টব্য: পূর্ববর্তী উত্তরগুলির বেনিফিটটি হ'ল বর্তমান শাখার নাম পেতে আপনার আলাদা কমান্ডের দরকার নেই "" শিরোনাম "এবং" @ {ইউ} "(বর্তমান শাখার উজানের) এটি যত্ন নিন See দেখুন আরও তথ্যের জন্য "গিট রেভ-পার্স - হেল্প")


আমি @ {u} স্বাধীনভাবে আবিষ্কার করেছি এবং আপনার উত্তর দেখার আগে আমার উত্তর আপডেট করেছিলাম।
নীল মেহেহে

1
git rev-parse @{u}আসলেই কি সর্বশেষতম প্রতিশ্রুতি প্রদর্শন করবে git fetch?
কাইল স্ট্র্যান্ড

3
এই ছিল টিকিট! যদিও, আপনার যুক্তিটি ব্যবহার করছে ==যার অর্থ "যদি আপ স্ট্রিম থেকে কোনও পরিবর্তন হয় না" means আমি !=আমার অ্যাপ্লিকেশনটির জন্য "যদি প্রবাহ থেকে পরিবর্তিত হয় তবে" পরীক্ষা করে দেখতাম। git fetchপ্রথম ভুলবেন না !
ক্রিসপ্রিম

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

উইন্ডোজ ব্যবহারকারীদের @{u}উদাহরণস্বরূপ চারপাশে একক উদ্ধৃতি প্রয়োজনgit rev-parse '@{u}'
স্পুডার

36

আদেশ

git ls-remote origin -h refs/heads/master

রিমোটে বর্তমান মাথাটি তালিকাভুক্ত করবে - আপনি এটি আগের মানের সাথে তুলনা করতে পারেন বা আপনার স্থানীয় রেপোতে আপনার কাছে এসএএচএ আছে কিনা তা দেখতে পারেন।


1
এই মানগুলির তুলনা করার জন্য কোনও নমুনা স্ক্রিপ্ট?
তাকেশিন

18
git rev-list HEAD...origin/master --countদুজনের মধ্যে আপনাকে "বিভিন্ন" কমিটের মোট সংখ্যা দেবে।
জ্যাক বার্গার

3
@ জবার্গার স্পষ্ট করতে, এটি কেবলমাত্র আপনার পিছনে থাকা (আগে এবং পিছনে নয়) কমিটের সংখ্যাটি প্রদর্শন করবে এবং এটি কেবল আপনি git fetchবা git remote updateপ্রথম হলে কাজ করে । git statusবিটিডব্লিউ একটি গণনাও দেখায়।
ডেনিস

1
@ ডেনিস আমি ভেবেছিলাম .."উত্স / মাস্টার প্রতিশ্রুতিবদ্ধ, হেড বিয়োগ করে" (অর্থাত্ পিছনে কমিটের সংখ্যা)। যেহেতু, ...হয় প্রতিসম পার্থক্য (অর্থাত এগিয়ে এবং পিছনে)
জেক বার্জার

3
চমৎকার। আমি যতদূর বলতে পারি, এটিই একমাত্র সমাধান যা প্রকৃতপক্ষে আপডেটের জন্য উত্সটি পরীক্ষা করে তবে সুস্পষ্টভাবে একটি করে না fetch
কাইল স্ট্র্যান্ড

35

এখানে একটি ব্যাশ ওয়ান-লাইনার রয়েছে যা বর্তমান শাখার হেড কমিট হ্যাশের সাথে তার প্রত্যন্ত উজানের শাখার সাথে তুলনা করে, কোনও ভারী git fetchবা git pull --dry-runঅপারেশন প্রয়োজন নেই:

[ $(git rev-parse HEAD) = $(git ls-remote $(git rev-parse --abbrev-ref @{u} | \
sed 's/\// /g') | cut -f1) ] && echo up to date || echo not up to date

এই কিছুটা ঘন রেখাটি কীভাবে ভেঙে গেছে তা এখানে:

  • কমান্ডগুলি $(x)বাশ কমান্ড-সাবস্টিটিউশন সিনট্যাক্স ব্যবহার করে গোষ্ঠীভুক্ত এবং নেস্ট করা হয় ।
  • git rev-parse --abbrev-ref @{u}একটি সংক্ষিপ্ত upstream রেফ (উদাঃ origin/master) প্রদান করে, যা পরে পাইপড sedকমান্ড দ্বারা স্থান-বিভাজিত ক্ষেত্রগুলিতে রূপান্তরিত হয় , যেমন origin master
  • এই স্ট্রিং খাওয়ানো হয় git ls-remoteযা দূরবর্তী শাখার প্রধান প্রতিশ্রুতি দেয়। এই কমান্ডটি দূরবর্তী সংগ্রহস্থলের সাথে যোগাযোগ করবে। পাইপডcut কমান্ড ট্যাব-বিভাজিত রেফারেন্স স্ট্রিংটি সরিয়ে কেবল প্রথম ক্ষেত্রটি (কমিট হ্যাশ) বের করে।
  • git rev-parse HEAD স্থানীয় কমিট হ্যাশ ফেরত।
  • বাশ সিনট্যাক্সটি [ a = b ] && x || yওয়ান-লাইনার সম্পূর্ণ করে: এটি একটি পরীক্ষা কন্সট্রাক্টের মধ্যে বাশ স্ট্রিং-তুলনা হয় , তারপরে এবং তালিকা এবং তালিকা তৈরি করে ।=[ test ]&& true || false

2
আপনি শাখার নামগুলিতে স্ল্যাশ ব্যবহার করলে আমি সেডে / জি ব্যবহার করব না । এটি কেবল "সেড 's / \ // /"।
মার্টিন ডেভিস

@wjordan আপনার সমাধান ব্যর্থ হলে দূরবর্তী সংগ্রহস্থল পৌঁছানো যাচ্ছে না (বা রক্ষণাবেক্ষণ অধীনে) এবং "আপ টু ডেট" আরম্ভ হবে
ফ্রেম

20

আমি আপনাকে https://github.com/badele/gitcheck স্ক্রিপ্টটি দেখতে যেতে পরামর্শ দিই । আপনার সমস্ত গিট সংগ্রহস্থলগুলিকে এক পাসে চেক করার জন্য আমি এই স্ক্রিপ্টটি কোড করে দিয়েছি এবং এটি দেখায় যে কারা প্রতিশ্রুতিবদ্ধ হয়নি এবং কে ঠেলাঠেলি / টানেনি।

এখানে একটি নমুনা ফলাফল:

এখানে চিত্র বিবরণ লিখুন


6
ঝরঝরে, খাঁটি
শাঁসে

1
এখন, আপনি সরাসরি ডকারের ধারক (আপনার হোস্টে থাকা ফাইলগুলির সাথে) থেকেও গিচচিেক ব্যবহার করতে পারেন আরও তথ্যের জন্য গিচচিঠ গিথুব প্রকল্পটি দেখুন
ব্রুনো অ্যাডেল é মে'১

ব্যাশ গিট-মাল্টি-রেপো-টুলিংয়ের অনুরূপ একটি সরঞ্জাম । git mrepo -cএটি সমস্ত মুলতুবি কমিটি প্রদর্শন করবে।
গ্রেগ

11

আমি এই সমাধানটি @ জবার্গারের মন্তব্যের ভিত্তিতে তৈরি করেছি।

if git checkout master &&
    git fetch origin master &&
    [ `git rev-list HEAD...origin/master --count` != 0 ] &&
    git merge origin/master
then
    echo 'Updated!'
else
    echo 'Not updated.'
fi

আপনার আগের মন্তব্য উল্লেখ , এই মুহুর্তে আমি আপনাকে একটি নির্দিষ্ট উত্তর দিতে পারি না। আমি যখন এই মন্তব্যগুলি করেছি তখন আমি গিটের গভীরতা এবং বিশেষত দূরবর্তী স্থান এবং বিচ্ছিন্নতার গভীরে ডুব দিচ্ছিলাম। তখন থেকে কয়েক মাস হয়ে গেছে এবং সেই জ্ঞানটি অনেকটা আমার মস্তিষ্কের ভিতরে সমাধিস্থ হয়েছে। ;) আপনি যদি দুজনের মধ্যে 'বিভিন্ন' কমিটের সংখ্যাটি সন্ধান করেন তবে ...আপনার সমাধানের একটি বৈধ অংশ বলে মনে হচ্ছে।
জেক বার্গার

1
ধন্যবাদ। এটা পরিষ্কার ছিল।
শোভিত পুরি

10

ইতিমধ্যে অনেকগুলি বৈশিষ্ট্য সমৃদ্ধ এবং বুদ্ধিমান উত্তর রয়েছে। কিছু বিপরীতে সরবরাহ করার জন্য, আমি খুব সাধারণ লাইন দিয়ে করতে পারি।

# Check return value to see if there are incoming updates.
if ! git diff --quiet remotes/origin/HEAD; then
 # pull or whatever you want to do
fi

2
আসল উত্তরের অভাব ছিল '!' যদি। গিট ডিফ থেকে ফেরতের মান শূন্য, যখন কোনও পরিবর্তন নেই।
থুওইলা

আইএমও এর সর্বোত্তম সমাধান, সেখানে আমাকে "রিমোটস / অরিজিন / হেড" বিকল্পের সাথে "উত্স / মাস্টার" বা অন্যান্য সংশোধন করা দরকার
ম্যাথিয়াস মাইকেল অ্যাঞ্জ

9

আমি মনে করি এটি করার সর্বোত্তম উপায়টি হ'ল:

git diff remotes/origin/HEAD

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


9

নীচের স্ক্রিপ্ট পুরোপুরি কাজ করে।

changed=0
git remote update && git status -uno | grep -q 'Your branch is behind' && changed=1
if [ $changed = 1 ]; then
    git pull
    echo "Updated successfully";
else
    echo "Up-to-date"
fi

6

আমি ব্রোলের পরামর্শ মতো করব। নিম্নলিখিত এক-লাইন স্ক্রিপ্টটি আপনার সর্বশেষ প্রদত্ত সংস্করণটির SHA1 নেয় এবং এটিকে দূরবর্তী উত্সের সাথে তুলনা করে এবং পরিবর্তিত পরিবর্তনগুলি কেবল যদি সেগুলি পৃথক করে তবেই টানুন। এবং এটা আরও বেশি উপর ভিত্তি করে সমাধান হালকা ওজন এর git pullবা git fetch

[ `git log --pretty=%H ...refs/heads/master^` != `git ls-remote origin
-h refs/heads/master |cut -f1` ] && git pull

এই কমান্ডটি ব্যর্থ হয়, যদি গিট সংগ্রহস্থলটি "--depth 1" (ডাউনলোডের আকার সীমাবদ্ধ করতে) দিয়ে ক্লোন করা থাকে। আপনি কি জানেন, যদি এটির সমাধানের কোনও উপায় থাকে?
অ্যাডাম রাইজকোভস্কি

গিট লগ এটি অনেকগুলি লাইন ফিরিয়ে দিচ্ছে এবং একটি ত্রুটি দিচ্ছে "বাশ: [: অত্যধিক যুক্তি" "আমি স্যুইচ করেছিgit rev-parse --verify HEAD
ড্রয় পিয়ার্স

1
এটি বাশ দ্বারা করা একটি সাধারণ স্ট্রিং তুলনা। যদি কিছু ব্যর্থ হয় তবে আমি আপনাকে আপনার সিনট্যাক্স পরীক্ষা করার পরামর্শ দেব (যেমন আপনি এটি ভুল টাইপ করছেন)। প্রথমে git log --pretty=%H ...refs/heads/master^ আপনার সর্বশেষ প্রদত্ত সংস্করণটির git ls-remote origin -h refs/heads/master |cut -f1 SHA1 পেতে চালান এবং তারপরে দূরবর্তী উত্সের SHA1 পেতে চালান run এই দুটি গিট কমান্ড এবং বাশের সাথে কোনও সম্পর্ক নেই। স্কয়ার বন্ধনীগুলির মধ্যে বাশ কী করে তা হ'ল প্রথম কমান্ড থেকে আউটপুটটিকে দ্বিতীয়টির সাথে তুলনা করা, এবং যদি তারা সমান হয় তবে এটি সত্য হয় এবং রান হয় git pull
ক্লাদিও ফ্লোরানি

"এবং যদি তারা সমান হয় তবে এটি সত্য ফিরে আসে এবং রান করে git pull"। আমি জানি আমি নিটপিকি হয়ে যাচ্ছি, তবে কাউকে বিভ্রান্তি থেকে বাঁচানোর জন্য এটি হওয়া উচিত "এবং যদি তারা সমান না হয়"। এছাড়াও, যে কারণেই হোক না কেন, প্রথম গিট কমান্ডটি আমার পক্ষে কাজ করে না। (আমি গিটে আছি 2.4.1)) সুতরাং আমি কেবল git log --pretty=%H master | head -n1পরিবর্তে ব্যবহার করছি । তবে আমি নিশ্চিত নই যে এটি ঠিক একই রকম কিনা।
xd1le

6

আপনি যদি এই স্ক্রিপ্টটি চালনা করেন তবে এটি পরীক্ষা করবে যে বর্তমান শাখার একটি দরকার git pull:

#!/bin/bash

git fetch -v --dry-run 2>&1 |
    grep -qE "\[up\s+to\s+date\]\s+$(
        git branch 2>/dev/null |
           sed -n '/^\*/s/^\* //p' |
                sed -r 's:(\+|\*|\$):\\\1:g'
    )\s+" || {
        echo >&2 "Current branch need a 'git pull' before commit"
        exit 1
}

এড়ানোর জন্য এটি গিট হুক প্রাক-প্রতিশ্রুতি হিসাবে রাখা খুব সুবিধাজনক

Merge branch 'foobar' of url:/path/to/git/foobar into foobar

যখন আপনি commitআগে pulling

এই কোডটি হুক হিসাবে ব্যবহার করতে, কেবল স্ক্রিপ্টটি অনুলিপি করুন / আটকান

.git/hooks/pre-commit

এবং

chmod +x .git/hooks/pre-commit

6

আমি কেবল এটি একটি আসল পোস্ট হিসাবে পোস্ট করতে চাই কারণ মন্তব্যগুলিতে এটি মিস করা সহজ।

এই প্রশ্নের সঠিক এবং সর্বোত্তম উত্তরটি @ জ্যাক বার্গার দিয়েছেন, আপনাকে অনেক ধন্যবাদ বন্ধু, প্রত্যেককে এটির প্রয়োজন এবং মন্তব্যগুলিতে প্রত্যেকে এটি মিস করে ses সুতরাং এখানে যার যার যার সাথে লড়াই করছে তার সঠিক উত্তর, এই কমান্ডের আউটপুটটি ব্যবহার করে আপনাকে গিট টানতে হবে কিনা তা জানতে to যদি আউটপুট 0 হয় তবে স্পষ্টতই আপডেট করার মতো কিছুই নেই।

@ স্ট্যাকওভারফ্লো, এই লোকটিকে একটি ঘণ্টা দিন। ধন্যবাদ @ জ্যাক বার্গার

git rev-list HEAD...origin/master --count will give you the total number of "different" commits between the two.  Jake Berger Feb 5 '13 at 19:23

4

git fetch (remote)আপনার রিমোট রেফগুলি আপডেট করতে চালান , এটি আপনাকে নতুন কি তা দেখায়। তারপরে, আপনি যখন আপনার স্থানীয় শাখাটি চেকআউট করবেন তখন এটি আপনাকে দেখায় যে এটি প্রবাহের পিছনে রয়েছে কিনা।


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

সত্য, আপনি রিমোটগুলি আনার পরে এটিও প্রদর্শিত git statusহবে।
শে

1
এটি মুডের মধ্যে কিছু git pull --dry-runকরে তবে আমি মনে করি প্রতি মিনিটে ক্রোন স্ক্রিপ্টটি চালানো ভারী।
তাকেশীন

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

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

4

সমাধান এত সংক্ষিপ্ত এবং সহজ যখন এই ধরণের সমস্ত জটিল দমন:

#!/bin/bash

BRANCH="<your branch name>"
LAST_UPDATE=`git show --no-notes --format=format:"%H" $BRANCH | head -n 1`
LAST_COMMIT=`git show --no-notes --format=format:"%H" origin/$BRANCH | head -n 1`

git remote update
if [ $LAST_COMMIT != $LAST_UPDATE ]; then
        echo "Updating your branch $BRANCH"
        git pull --no-edit
else
        echo "No updates available"
fi

LAST_COMMIT এবং LAST_UPDATE পরিবর্তনগুলি থাকলেও সর্বদা সমান
ক্যানব্যাক্স

এই সমাধানটি খুব সহজ এবং সহজ, git remote updateসর্বশেষ উত্সের প্রতিশ্রুতি সম্পর্কিত তথ্য পেতে আপনার কোডের আগে কার্যকর করা দরকার
ak93

কমান্ডের git remote updateআগে সংযোজন করা উচিত নয় git show?
Setop

2

এখানে আমার বাশ স্ক্রিপ্টের সংস্করণ যা পূর্বনির্ধারিত ফোল্ডারে সমস্ত সংগ্রহস্থলগুলি পরীক্ষা করে:

https://gist.github.com/henryiii/5841984

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

আপনার পাথের একটি ফোল্ডারে একটি সিমিলিংক (বা স্ক্রিপ্ট) রাখুন, তারপরে এটি git all status(, ইত্যাদি) হিসাবে কাজ করে । এটি কেবল উত্স / মাস্টারকে সমর্থন করে তবে এটি সম্পাদিত বা অন্য পদ্ধতির সাথে সংযুক্ত করা যেতে পারে।


1
git ls-remote | cut -f1 | git cat-file --batch-check >&-

আপনার রেপোতে নেই এমন কোনও রিমোটে রেফারেন্সযুক্ত সমস্ত কিছু তালিকাভুক্ত করে। আপনার ইতিমধ্যে থাকা জিনিসগুলিতে রিমোট রেফার পরিবর্তনগুলি ধরার জন্য (যেমন পূর্ববর্তী প্রতিশ্রুতিগুলিতে পুনরায় সেট করা) একটু বেশি সময় নেয়:

git pack-refs --all
mine=`mktemp`
sed '/^#/d;/^^/{G;s/.\(.*\)\n.* \(.*\)/\1 \2^{}/;};h' .git/packed-refs | sort -k2 >$mine
for r in `git remote`; do 
    echo Checking $r ...
    git ls-remote $r | sort -k2 | diff -b - $mine | grep ^\<
done

1

আপনি যদি ক্রোনটাব হিসাবে টাস্ক যুক্ত করতে চান তবে এটি হতে পারে:

#!/bin/bash
dir="/path/to/root"
lock=/tmp/update.lock
msglog="/var/log/update.log"

log()
{
        echo "$(date) ${1:-missing}" >> $msglog
}

if [ -f $lock ]; then
        log "Already run, exiting..."
else
        > $lock
        git -C ~/$dir remote update &> /dev/null
        checkgit=`git -C ~/$dir status`
        if [[ ! "$checkgit" =~ "Your branch is up-to-date" ]]; then
                log "-------------- Update ---------------"
                git -C ~/$dir pull &>> $msglog
                log "-------------------------------------"
        fi
        rm $lock

fi
exit 0

1

সাধারণ রিজেক্সপ ব্যবহার করা হচ্ছে:

str=$(git status) 
if [[ $str =~ .*Your\ branch\ is\ behind.*by.*commits,\ and\ can\ be\ fast-forwarded ]]; then
    echo `date "+%Y-%m-%d %H:%M:%S"` "Needs pull"
else
    echo "Code is up to date"
fi

এটি কাজ করবে না। গিট স্ট্যাটাসটি কেবলমাত্র একটি স্থানীয় চেক, এবং তাই কেবলমাত্র যদি আপনি ইতিমধ্যে আপনার দূরবর্তী ডিফগুলি আপডেট করে থাকেন তবে আপনার শাখাটি পিছনে রয়েছে কিনা তা আপনাকে কেবল তা বলে দেবে।
minhaz1

0

আমি স্টিফেন হাবম্যানের উত্তরের উপর ভিত্তি করে স্ক্রিপ্টের একটি সংস্করণ ব্যবহার করছি:

if [ -n "$1" ]; then
    gitbin="git -C $1"
else
    gitbin="git"
fi

# Fetches from all the remotes, although --all can be replaced with origin
$gitbin fetch --all
if [ $($gitbin rev-parse HEAD) != $($gitbin rev-parse @{u}) ]; then
    $gitbin rebase @{u} --preserve-merges
fi

এই স্ক্রিপ্টটিকে ডাকা হয়েছে বলে ধরে নেওয়া git-fetch-and-rebase, এটি একটি alচ্ছিক যুক্তি দিয়ে আহ্বান করা যেতে পারেdirectory name অপারেশন সম্পাদনের জন্য স্থানীয় গিট সংগ্রহস্থলের একটি alচ্ছিক । যদি স্ক্রিপ্টটি কোনও যুক্তি ছাড়াই ডাকা হয়, এটি বর্তমান ডিরেক্টরিটিকে গিট সংগ্রহস্থলের অংশ হিসাবে ধরে নিয়েছে।

উদাহরণ:

# Operates on /abc/def/my-git-repo-dir
git-fetch-and-rebase /abc/def/my-git-repo-dir

# Operates on the Git repository which the current working directory is part of
git-fetch-and-rebase

এটি এখানেও পাওয়া যায় ।


0

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

আপনি যদি উইন্ডোতে থাকেন তবে উইন্ডোতে উইন্ডোজ (ইনস্টলেশন বা বহনযোগ্য) সরবরাহ করা গিট বাশ ব্যবহার করে আপনি এই স্ক্রিপ্টটি উইন্ডোতে চালাতে পারেন।

এই স্ক্রিপ্টের পক্ষে যুক্তি প্রয়োজন requires

- স্থানীয় পথ যেমন / d / উত্স / প্রকল্প 1
- গিট ইউআরএল যেমন https: //username@bitbucket.org/username/project1.git
- পাসওয়ার্ড

যদি সরল পাঠ্যে কমান্ড লাইনে একটি পাসওয়ার্ড প্রবেশ করা না যায়,
তারপরে স্ক্রিপ্টটি পরিবর্তন করে GITPASS খালি রয়েছে কিনা তা পরীক্ষা করতে; করো না
প্রতিস্থাপন করুন এবং একটি পাসওয়ার্ডের জন্য গিটকে প্রম্পট করুন

স্ক্রিপ্ট হবে

- Find the current branch
- Get the SHA1 of the remote on that branch
- Get the SHA1 of the local on that branch
- Compare them.

যদি স্ক্রিপ্ট দ্বারা মুদ্রিত হিসাবে কোনও পরিবর্তন হয়, তবে আপনি আনতে বা টানতে এগিয়ে যেতে পারেন। স্ক্রিপ্টটি দক্ষ নাও হতে পারে তবে এটি আমার জন্য কাজটি করে।

আপডেট - 2015-10-30: কনসোলে পাসওয়ার্ড সহ ইউআরএল মুদ্রণ রোধ করতে stderr to dev নাল।

#!/bin/bash

# Shell script to check if a Git pull is required.

LOCALPATH=$1
GITURL=$2
GITPASS=$3

cd $LOCALPATH
BRANCH="$(git rev-parse --abbrev-ref HEAD)"

echo
echo git url = $GITURL
echo branch = $BRANCH

# Bash replace - replace @ with :password@ in the GIT URL
GITURL2="${GITURL/@/:$GITPASS@}"
FOO="$(git ls-remote $GITURL2 -h $BRANCH 2> /dev/null)"
if [ "$?" != "0" ]; then
  echo cannot get remote status
  exit 2
fi
FOO_ARRAY=($FOO)
BAR=${FOO_ARRAY[0]}
echo [$BAR]

LOCALBAR="$(git rev-parse HEAD)"
echo [$LOCALBAR]
echo

if [ "$BAR" == "$LOCALBAR" ]; then
  #read -t10 -n1 -r -p 'Press any key in the next ten seconds...' key
  echo No changes
  exit 0
else
  #read -t10 -n1 -r -p 'Press any key in the next ten seconds...' key
  #echo pressed $key
  echo There are changes between local and remote repositories.
  exit 1
fi

0

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

cd C:\<path to repo>
git remote update                           #update remote
$msg = git remote show origin               #capture status
$update = $msg -like '*local out of date*'
if($update.length -gt 0){                   #if local needs update
    Write-Host ('needs update')
    git pull
    git reset --hard origin/master
    Write-Host ('local updated')
} else {
    Write-Host ('no update needed')
}

0

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

import os
import logging
import subprocess

def check_for_updates(directory:str) -> None:
    """Check git repo state in respect to remote"""
    git_cmd = lambda cmd: subprocess.run(
        ["git"] + cmd,
        cwd=directory,
        stdout=subprocess.PIPE,
        check=True,
        universal_newlines=True).stdout.rstrip("\n")

    origin = git_cmd(["config", "--get", "remote.origin.url"])
    logging.debug("Git repo origin: %r", origin)
    for line in git_cmd(["fetch"]):
        logging.debug(line)
    local_sha = git_cmd(["rev-parse", "@"])
    remote_sha = git_cmd(["rev-parse", "@{u}"])
    base_sha = git_cmd(["merge-base", "@", "@{u}"])
    if local_sha == remote_sha:
        logging.info("Repo is up to date")
    elif local_sha == base_sha:
        logging.info("You need to pull")
    elif remote_sha == base_sha:
        logging.info("You need to push")
    else:
        logging.info("Diverged")

check_for_updates(os.path.dirname(__file__))

HTH


-5

আপনি একটি ফিলিং স্ক্রিপ্টও খুঁজে পেতে পারেন যিনি এখন এটি করেন।

আমার উত্পাদনের পরিবেশগুলি স্বয়ংক্রিয়ভাবে আপডেট করার জন্য আমার একটি সমাধানের দরকার ছিল এবং আমি ভাগ করছি এই স্ক্রিপ্টটির জন্য আমরা খুব খুশি।

স্ক্রিপ্টটি এক্সএমএলে লিখিত এবং ফিলিংয়ের প্রয়োজন ।


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