Aktualizacja 2013:
Nowsze wersje git autoryzacji za pomocą seryjnej ze strategią recursive
i strategia opcji ( -X
):
git merge -s recursive -Xignore-space-at-eol
Ale użycie „ -Xignore-space-change
” jest również możliwe
jakub.g komentuje również, że strategie działają również przy wybieraniu wiśni :
git cherry-pick abcd123456 --strategy=recursive --strategy-option=renormalize
Działa to znacznie lepiej niż ignore-all-space
.
Oryginalna odpowiedź (maj 2009)
Łatka do ignorowania stylu eol została zaproponowana w czerwcu 2007 roku , ale dotyczy tylko git diff --ignore-space-at-eol
, nie git merge
.
W tym czasie zadawano pytanie:
Czy powinna --ignore-space-at-eol
być opcja git-merge
?
W przypadku fuzji ta funkcjonalność ma znaczenie.
Jaka jest semantyka automatycznie rozstrzygniętego scalania z tymi opcjami w efekcie - czy są one używane tylko do wykrywania zmian nazwy, czy np. Nie powodujemy konfliktów flag tylko ze zmianami spacji? A jeśli nie, którą wersję akceptujemy automatycznie?
Julio C Hamano nie był zbyt entuzjastyczny:
Z pewnością jest to kuszące, ale podejrzewam, że należy to odłożyć na później.
Podejrzewam, że wprowadziłoby to koncepcję dwóch różnych rodzajów różnic, z których jeden byłby przetwarzany mechanicznie (tj. Używany w połączeniu z „git-merge-recursive”, a stosowany z „git-am”), a drugi do sprawdzenia przez ludzi do zrozumienia.
W tym drugim przypadku często przydatne może być pogrzebanie danych wejściowych, nawet jeśli dane wyjściowe z porównania zmontowanych plików wejściowych mogą nie być łatwe do wykorzystania w zastosowaniach mechanicznych.
Ogólną ideą git merge
jest poleganie na narzędziu do scalania innej firmy.
Na przykład skonfigurowałem DiffMerge jako narzędzie do scalania Git, ustawiając zestaw reguł, który pozwala temu narzędziu scalającemu ignorować eol dla określonego typu plików.
Konfiguracja w systemie Windows z MSysGit1.6.3, dla sesji bash DOS lub Git, z DiffMerge lub KDiff3:
- ustaw katalog w swojej PATH (tutaj:)
c:\HOMEWARE\cmd
.
- dodaj do tego katalogu skrypt merge.sh (opakowanie dla twojego ulubionego narzędzia do scalania)
merge.sh:
#!/bin/sh
# Passing the following parameters to mergetool:
# local base remote merge_result
alocal=$1
base=$2
remote=$3
result=$4
if [ -f $base ]
then
#"C:/Program Files/SourceGear/DiffMerge/DiffMerge.exe" "$alocal" "$base" "$remote" -m --result="$result" --title1="Mine" --title2="Merging to: $result" --title3="Theirs"
# for merge respecting eol, KDiff3 is better than DiffMerge (which will always convert LF into CRLF)
# KDiff3 will display eol choices (if Windows: CRLF, if Unix LF)
"C:/Program Files/KDiff3/kdiff3.exe" -m "$base" "$alocal" "$remote" -o "$result"
else
#there is not always a common ancestor: DiffMerge needing 3 files, BASE will be the result
#"C:/Program Files/SourceGear/DiffMerge/DiffMerge.exe" "$alocal" "$result" "$remote" -m --result="$result" --title1="Mine" --title2="Merging to: $result" --title3="Theirs"
# KDiff3 however does know how to merge based on 2 files (not just 3)
"C:/Program Files/KDiff3/kdiff3.exe" -m "$base" "$remote" -o "$result"
fi
- Zadeklaruj opakowanie scalania dla Git
Polecenia konfiguracyjne Git:
git config --global merge.tool diffmerge
git config --global mergetool.diffmerge.cmd "merge.sh \"$PWD/$LOCAL\" \"$PWD/$BASE\" \"$PWD/$REMOTE\" \"$PWD/$MERGED\"
git config --global mergetool.diffmerge.trustExitCode false
git config --global mergetool.diffmerge.keepBackup false
- Sprawdź, czy autoCRLF ma wartość false
Konfiguracja git na poziomie systemu:
git config ---system core.autoCRLF=false
- Sprawdź, czy jeśli dwie linie są identyczne (ale ich znaki eol), zarówno DiffMerge, jak i KDiff3 zignorują te linie podczas scalania.
Skrypt DOS (uwaga: polecenie dos2unix pochodzi stąd i jest używane do symulacji uniksowego stylu eol. To polecenie zostało skopiowane do katalogu wymienionego na początku tej odpowiedzi.):
C:\HOMEWARE\git\test>mkdir test_merge
C:\HOMEWARE\git\test>cd test_merge
C:\HOMEWARE\git\test\test_merge>git init
C:\HOMEWARE\git\test\test_merge>echo a1 > a.txt & echo a2 >> a.txt
C:\HOMEWARE\git\test\test_merge>git add a.txt
C:\HOMEWARE\git\test\test_merge>git commit -m "a.txt, windows eol style"
C:\HOMEWARE\git\test\test_merge>git checkout -b windows
Switched to a new branch 'windows'
C:\HOMEWARE\git\test\test_merge>echo a3 >> a.txt & echo a4 >> a.txt
C:\HOMEWARE\git\test\test_merge>git add a.txt
C:\HOMEWARE\git\test\test_merge>git commit -m "add two lines, windows eol style"
C:\HOMEWARE\git\test\test_merge>git checkout master
C:\HOMEWARE\git\test\test_merge>git checkout -b unix
Switched to a new branch 'unix'
C:\HOMEWARE\git\test\test_merge>echo au3 >> a.txt & echo au4 >> a.txt && echo au5 >> a.txt
C:\HOMEWARE\git\test\test_merge>dos2unix a.txt
Dos2Unix: Processing file a.txt ...
C:\HOMEWARE\git\test\test_merge>git add a.txt
C:\HOMEWARE\git\test\test_merge>git commit -m "add 3 lines, all file unix eol style"
[unix c433a63] add 3 lines, all file unix eol style
C:\HOMEWARE\git\test\test_merge>git merge windows
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt
Automatic merge failed; fix conflicts and then commit the result.
C:\HOMEWARE\git\test\test_merge>git ls-files -u
100644 39b4c894078a02afb9b1dfeda6f1127c138e38df 1 a.txt
100644 28b3d018872c08b0696764118b76dd3d0b448fca 2 a.txt
100644 3994da66530b4df80189bb198dcfac9b8f2a7b33 3 a.txt
C:\HOMEWARE\git\test\test_merge>git mergetool
Merging the files: a.txt
Normal merge conflict for 'a.txt':
{local}: modified
{remote}: modified
Hit return to start merge resolution tool (diffmerge):
W tym momencie (naciśnięcie „return”) otworzy się DiffMerge lub KDiff3 i sam zobaczysz, które linie są faktycznie scalane, a które ignorowane.
Ostrzeżenie : plik wynikowy zawsze będzie w trybie eol systemu Windows (CRLF) z DiffMerge ...
KDiff3 oferuje zapisywanie w taki czy inny sposób.