2016-02-25 18 views
8

में फ़ाइल के लिए गिट शाखाएं खोजें I प्रारंभिक संघर्ष पहचान के तरीके के रूप में, मेरे और अन्य सभी के बीच सामान्य में किसी भी संशोधित फ़ाइलों के लिए गिट शाखाएं खोजना चाहूंगा। क्या कोई तरीका है कि गिट मुझे ऐसा करने की अनुमति देगी जो मैं देख रहा हूं (या खोल स्क्रिप्टिंग के माध्यम से)?सामान्य

विधि मैं अभी है के बारे में सोचा गया है, एक के बाद प्रतिबद्ध हुक के रूप में:

  1. शाखा मैं तैयार हूं पर एक git diff --name-only master प्रदर्शन, सभी फाइलों को मैं के लिए खोज पता लगाया जाएगा कि अन्य शाखाओं में
  2. खोज/git diff --name-only origin/<remote branch> origin/master के माध्यम से हर किसी के अन्य दूरस्थ शाखाओं में मैं प्राप्त कर लिया है प्रत्येक फ़ाइल (पिछले चरण में) के लिए grep'ing दूरदराज के भंडार पर
  3. एक रिटर्निंग (एक परस्पर विरोधी शाखाओं की सूची बनाने के लिए) शाखाओं की सूची जिसमें एक या अधिक फाइलें हैं टी मेरी खोज/grep के परिणामों के आधार पर टोपी संघर्ष।

उत्तर

4

उपलब्ध तरीकों में से अधिकांश में "How can I preview a merge in git?"

दूसरे चरण के लिए आप का उल्लेख सबसे तेजी से एक है (करने के लिए वास्तव में --no-ff और --no-commit साथ मर्ज की तुलना में)

git diff --name-status origin/abranch 

है सूचीबद्ध हैं (डिफ़ॉल्ट रूप से HEAD की तुलना में)

आप add a status filter कर सकते हैं, क्योंकि आप संशोधित फ़ाइलों की खोज करते हैं (ब्रंच के बीच सामान्य फ़ाइलें संशोधन के साथ)

पहले चरण की आवश्यकता नहीं है: दूसरा व्यक्ति सीधे HEAD की तुलना में सामान्य संशोधित फ़ाइलों को सूचीबद्ध करेगा।

git diff --name-status --diff-filter=M origin/abranch 
+0

मैं अपने प्रश्न को सुधार लिया है के बाद से मुझे लगता है कि मैं स्पष्ट नहीं था, लेकिन http://stackoverflow.com/a/33267627/1034537 में आदेश अनिवार्य रूप से पार्टी स्क्रिप्ट मैं करूंगा का एक उदाहरण है मेरे परिदृश्य में बनाएं (सिवाय इसके कि मैं सभी दूरस्थ शाखाओं के माध्यम से लूप होगा)। – BLaZuRE

+0

@BLaZuRE बस अपनी रिमोट ट्रैकिंग शाखाओं पर लूप करें और प्रत्येक पर 'गिट diff --name-status --diff-filter = m origin/abranch' करें। आपको आपकी सामान्य संशोधित फ़ाइलों (संभावित विवादों के लिए उम्मीदवार) की सूची मिल जाएगी – VonC

3
potentially-conflicting-changes-between() { 
     local base=`git merge-base $1 $2` 
     { git diff --name-only $base $1 
      git diff --name-only $base $2 
     } | sort | uniq -d 
} 

सभी फ़ाइलें विलय संघर्ष के लिए जांच होगी दिखाएगा, तो यह refs चलाने का सिर्फ एक बात है, सबसे आसान हो सकता है

for other in `git branch -r`; do 
     printf '--- \n%s %s\n' master $other 
     potentially-conflicting-changes-between master $other 
done 

तुम भी कम कर सकते हैं -लेवल समान परिवर्तनों पर झूठी सकारात्मकताओं को खत्म करने के लिए सीधे तैयार करें, यह अधिक समय बचा सकता है लेकिन सभी संभावित संघर्षों के लिए सूचकांक विवरण सूचीबद्ध करेगा और जांच करेगा कि क्या विलय वास्तव में आपके वर्तमान वर्कट्री में बिना चल सकता है अप्रतिबद्ध काम पर omping

potentially-conflicting-changes-between() 
{ 
    (export GIT_INDEX_FILE=`git rev-parse --git-dir`/scratch-index; 
    git read-tree --empty; 
    git read-tree -m $(git merge-base $1 $2) $1 $2; 
    git ls-files -u) 
} 
+0

अच्छी स्क्रिप्ट। +1 – VonC

+0

धन्यवाद। । । । एचएम। यह मेरे लिए होता है मेरा पसंदीदा आदेश सिर्फ टिकट है। – jthill

+0

गिट मर्ज-बेस? (http://stackoverflow.com/a/24376032/6309) – VonC