2016-02-25 52 views
8

Chciałbym przeszukać gałęzie git dla wszystkich zmodyfikowanych plików wspólnych między kopalnią a wszystkimi innymi, jako metoda wczesnego wykrywania konfliktów. Czy istnieje metoda, dzięki której git pozwoliłby mi na to, że przeoczyłem (lub za pomocą skryptów powłoki)?Wyszukiwanie gałęzi Git dla wspólnego pliku

Metoda myślałem od teraz jest jako post-commit:

  1. Przeprowadzanie git diff --name-only master na gałęzi jestem w celu ustalenia wszystkich plików będę szukają w innych branżach (aby wygenerować listę sprzecznych oddziałów)
  2. Wyszukany/grep'ing dla każdego pliku mam uzyskanych (w poprzednim etapie) w każdym innym odległych oddziałów poprzez git diff --name-only origin/<remote branch> origin/master na zdalnym repozytorium
  3. Zwracanie lista gałęzi, które zawierają jeden lub więcej plików t konflikt kapelusza, na podstawie wyników wyszukiwania/grep.

Odpowiedz

4

Większość z dostępnych metod są wymienione w „How can I preview a merge in git?

Drugim krokiem wspomnieć jest jednym z najszybciej (w porównaniu do faktycznie wykonywać scalenia z --no-ff i --no-commit)

git diff --name-status origin/abranch 

(w porównaniu do HEAD domyślnie)

Możesz add a status filter, ponieważ szukasz zmodyfikowanych plików (wspólne pliki między branżą s ze zmianą)

Nie ma potrzeby wykonania pierwszego kroku: drugi z nich bezpośrednio wyświetli listę zmodyfikowanych plików w porównaniu do HEAD.

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

mam zmieniony na moje pytanie, ponieważ czuję, że było jasne, ale komendy http://stackoverflow.com/a/33267627/1034537 jest w istocie przykładem skryptu bash Chciałbym utwórz w moim scenariuszu (poza tym, że przeszukałbym wszystkie odległe gałęzie). – BLaZuRE

+0

@BLaZuRE po prostu zapętlaj swoje zdalne gałęzie śledzenia i wykonaj 'git diff --name-status --diff-filter = M origin/abranch' na każdym. Otrzymasz listę wspólnych plików zmodyfikowanych (kandydatów na potencjalne konflikty). – 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 
} 

pokaże wszystkie pliki, które łączą byłoby zbadać konflikty, to tylko kwestia prowadzenia sędziowie, najłatwiej może być

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

Można również zrobić niska -level prep prep bezpośrednio w celu wyeliminowania fałszywych alarmów przy identycznych zmianach, może to zaoszczędzić wiele czasu, ale wyświetli szczegóły indeksu dla wszystkich potencjalnych konfliktów i sprawdzi, czy scalenie może faktycznie działać w twoim bieżącym worktree bez st omping na niewykorzystanej pracy

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

Przyjemny scenariusz. +1 – VonC

+0

Dzięki. . . . hm. Zdarza mi się, że moja ulubiona komenda to tylko bilet tutaj. – jthill

+0

git merge-base? (http://stackoverflow.com/a/24376032/6309) – VonC