2012-05-25 18 views
17

शामिल हैं, मैं सभी फाइलों की एक सूची प्राप्त करना चाहता हूं, जिन्होंने दोबारा दोबारा सबमिट किए हैं जिनमें सबमिड्यूल शामिल हैं।गिट: सभी बदली गई फ़ाइलों की सूची जिसमें सबमिड्यूल

मैं जानता हूँ कि मैं यह कर सकता:

git diff --name-only --diff-filter=ACMR ${revision} HEAD 

यह submodule-पथ सहित फ़ाइलें, की एक सूची देता है, लेकिन नहीं के भीतर फ़ाइलों।

उदाहरण: मैंने एक सबमिशन अपडेट किया है। मैंने सुपर-प्रोजेक्ट का काम किया। अब मैं संशोधित की गई सभी फाइलों की एक सूची प्राप्त करना चाहता हूं।

क्या आप इसे करने के लिए एक तरीका जानते हैं?

उत्तर

3

तो, बहुत स्पष्ट स्क्रिप्ट है कि सभी परिवर्तन सूचीबद्ध एक संशोधन

#!/bin/sh 
echo "Listing changes for super module" 
git diff $1 --name-only 
subs=(`git submodule | awk '{print $2}'`) 
for sub in ${subs[*]}; do 
    lastrevision=`git diff $1 $sub | fgrep "Subproject" | head -n1 | awk '{print $3}'` 
    cd $sub 
    echo "Listing changes for $sub" 
    git diff $lastrevision --name-only 
    cd .. 
done 

यह एक तर्क लेता की तुलना - संशोधन आप के साथ तुलना करना चाहते हैं। सुनिश्चित करें कि fgrep "Subproject" है, fgrep "Submodule" नहीं।

+0

धन्यवाद। यह मुझे उन फ़ाइलों को दिखाएगा जो submodules की अंतिम प्रतिबद्धता के बाद से बदल गए हैं। लेकिन सुपर-प्रोजेक्ट के संशोधन के बीच मैं उन सभी फ़ाइलों को कैसे बदल सकता हूं (सबमिड्यूल सहित)? – 4eyes

+0

तो आप भी submodules कर रहे थे? मुझे लगता है कि आपको किसी प्रकार की स्क्रिप्ट की आवश्यकता होगी ... – BlacKow

+0

प्रोटीप ™: इसे 'गिट-डिफ-सबोड्यूल्यू' के रूप में सहेजें और इसे 'गिट डिफ-सबोड्यूल्यूल्स' – Zaz

13

अद्यतन 2017: के रूप में मैं "see diff of commit on submodule in gitlab" में उल्लेख किया है,

  • Git 2.11 (नवंबर 2016) का परिचय

    git diff --submodule=diff 
    
  • Git 2.14 (Q3 2017) में सुधार होगा कि में recursing द्वारा नेस्टेड submodules।
    commit 5a52214 (04 मई 2017) Stefan Beller (stefanbeller) द्वारा देखें।
    (commit a531ecf में Junio C Hamano -- gitster -- द्वारा विलय, 29 मई 2017)


मूल 2012 जवाब (पूर्व 2017 Git 2.14)

हो सकता है कि एक सरल रेखा पर्याप्त होगा:

git submodule foreach --recursive git diff --name-status 

यह वास्तव में submodules साथ में फ़ाइलों को सूचीबद्ध करेगा एन submodules।
(--recursive विकल्प git1.7.3 + से आता है)

+0

'गिट सबमिशन अपडेट --remote --recursive' के साथ चलाएं आपके 'foreach'' diff' कमांड से कुछ भी नहीं दिखाता है (क्योंकि यह प्रत्येक सबमिशन में केवल 'गिट diff' चलाता है)। हम अभी अपडेट किए गए अपडेट के अंतर को कैसे देख सकते हैं? – Zaz

+0

@Zaz एक 'अपडेट --remote' gitlink को बदल देगा (SHA1 सबमिट किए गए सबमिशन प्रतिबद्धता का प्रतिनिधित्व करता है)। यदि आप पिछली गिटलिंक sha1 और वर्तमान एक प्राप्त कर सकते हैं (पेरेंट रेपो में एक साधारण 'गिट diff' के साथ), तो आप सबमिशन में जा सकते हैं, और उन दो SHA1 के बीच' गिट diff' कर सकते हैं। – VonC

+0

मैंने सोचा कि प्रश्नकर्ता स्वचालित रूप से ऐसा करने का तरीका ढूंढ रहा था। – Zaz

3

आप git ls-tree का उपयोग कर, कौन-सा संस्करण एक submodule पर था पता कर सकते हैं, किसी दिए गए माता-पिता मॉड्यूल के लिए प्रतिबद्ध के रूप में:

subcommit=$(git ls-tree $parentcommit $submodulepath | awk '{print $3}') 

तो यहाँ एक स्क्रिप्ट है इस तरह

#!/bin/sh 

function compare { 
    if [[ -z "$3" ]]; 
     then git diff --name-only --ignore-submodules=all --diff-filter=ACMR "$1" "$2" 
     else git diff --name-only --ignore-submodules=all --diff-filter=ACMR "$1" "$2" | awk -v r=$3 '{ print "" r "/" $0}' 
    fi 

    for submodule in `git submodule | awk '{print $2}'` 
    do 
     old=$(git ls-tree $1 $submodule | awk '{print $3}') 
     new=$(git ls-tree $2 $submodule | awk '{print $3}') 
     (cd $submodule; compare $old $new $submodule) 
    done 
} 

compare "$1" "$2" 

हो जाएगा ताकि उत्पादन सभी फाइलें (हालांकि बेस एक submodule है): कि आपको इस बारे में ज्यादा मिलना चाहिए उत्पादन स्वरूपण और इस तरह से ऊपर HtmlTempl एटीएस/सीएसएस/स्क्रीन.css बेस/पीएचपी/कक्षाएं/सहायक।php

0

जुलाई 8,2017

अब एक submodule सहित एक diff प्राप्त करने के लिए, आप आदेश का उपयोग कर सकते हैं -

git diff --submodule=diff 

टिप्पणी - यह Git 2.14.0

साथ शुरू किया गया है

"गिट diff --submodule = diff" अब नेस्टेड submodules में recurses।

संबंधित मुद्दे

 संबंधित मुद्दे