2010-07-18 20 views
14

Sto cercando di unire due file .nib. FileMerge non ha problemi a mostrare il confronto tra i due file. Sto cercando di mantenere tutte le impostazioni in un file (cioè lato destro) tranne che per due impostazioni che voglio copiare dall'altro file (cioè lato sinistro). Le differenze sono solo una riga di codice ciascuna che modifica il valore intero di una chiave autoresizingMask. Quindi non dovrebbe essere difficile unire. Userei TextEdit se mi permettesse di aprire un file .nib.Il tipo di file .nib FileMerge non può essere unito

Tuttavia, ho ricevuto l'errore "Questo tipo di file non può essere unito." Ho provato a giocare con le impostazioni FileMerge> Preferenze> Filtri per l'estensione .nib come menzionato nella risposta a una domanda simile pubblicata su questo sito ma non ho avuto fortuna. Per quanto posso dire, l'impostazione Display dovrebbe essere lasciata come "filtrata" per un .nib poiché non filtrata non è leggibile e ho provato a selezionare la selezione Applica. Presumo che il filtro utilizzato non debba essere modificato o modificato di per sé?

C'è qualche motivo comune per cui due file .nib che FileMerge non ha problemi nella finestra di confronto non possono essere uniti?

Grazie

risposta

3

file NIB e XIB non possono essere unite, per quanto allettante possa essere. Potrebbe essere utile consultare un diff utilizzando FileMerge, ma utilizzare queste informazioni solo per informare quali modifiche vengono ricreate manualmente in Interface Builder.

Inoltre, FileMerge non mostra la differenza di testo effettiva dei file NIB, ma piuttosto l'output di ibtool. È possibile visualizzare il testo attuale diff eliminando la voce per NIB nelle preferenze FileMerge, ma questa impostazione non viene salvata tra i lanci di FileMerge.

+0

Hai esattamente ragione. Un pennino/xib è una versione Apple di un XML chiamato elenco di proprietà (abbreviato plist. Forse avete visto questi nei modelli di file di risorse). Per provarlo, fare clic con il tasto destro del mouse su pennino/XIB e selezionare "Apri come" e fare clic su "Elenco proprietà". Nessun altro file (ad eccezione di .plist) può essere aperto in questo modo. Per tornare indietro, torna a "Apri come" e fai clic su "Interface Builder" –

+1

Chase, non è del tutto corretto. I file XIB non sono plists; semplicemente essendo XML non implica che qualcosa potrebbe essere unito. Uno dei motivi per cui la fusione non funziona è perché il grafo degli oggetti rappresentato da un pennino non è puramente gerarchico, il che significa che ci sono altre relazioni diff/merge che non sanno come mantenere. –

4

XIB possono essere uniti. In casi semplici (come le modifiche al testo, gli elementi ridimensionati) è semplice e sicuro, e le ultime versioni XIB possono sopravvivere a fusioni ancora più complicate (Apple ha aggiornato il formato e al giorno d'oggi è ragionevolmente leggibile e non usa gli ID numerici usati per creare si fonde con l'errore.)

Il problema è che FileMerge ha una configurazione integrata con hardcoded per filtrare i file XIB tramite ibtool pretty-print, e questo indica che non sono unificabili.

// modifica: sembra che Apple abbia aggiunto la verifica dell'integrità dell'eseguibile, quindi la soluzione di patching non funziona più. "Smetti di usare FileMerge" è la soluzione ora.

Alcuni consigli:

  • opzione Attiva in Preferenze FileMerge "spazio bianco Compress".

  • Quando il diff è un totale disordine e i file XIB sembrano essere completamente diversi, sono probabilmente versioni diverse del formato. Eseguire questo su ogni file XIB, prima di fondersi (su file incontaminate senza marcatori di merge di conflitto):

    ibtool --write foo.xib --upgrade foo.xib 
    

Questo permette di convertire file XI ter ultima versione Xcode, quindi entrambi avranno la stessa struttura.

2

. I file .xib sono in formato testo - sono devono funzionare, in particolare quelli moderni che sono più simili ai file di storyboard. FileMerge, tuttavia, ha nelle sue preferenze Filtro una sezione per i file xib - confronta l'output elaborato piuttosto che i file originali. Ciò impedisce l'unione di essere salvato.

L'eliminazione della voce "xib" nelle preferenze dovrebbe teoricamente funzionare, ma ogni volta che provo a eliminare quella riga di filtro, sembra che ritorni quando lancio di nuovo FileMerge. Quindi, quell'approccio non sembra funzionare.

Ciò che sembra funzionare è semplicemente modificare il comando di filtro nella seconda colonna su cat (ovvero rimuovere il comando "ibtool" e i relativi argomenti e sostituirlo con "cat", che si tradurrà in una copia diretta di il file originale), quindi scegliere di visualizzare "Originale" anziché "Filtrato" nella terza colonna. A quel punto, FileMerge (senza l'hacking del file binario) sembra corretto quando si salvano i file .xib uniti.

Questo non funziona con i file .nib binari, ma questi non sono più modificati direttamente, quindi non dovrebbe essere un grosso problema durante le unioni.

+0

Mentre questo ha funzionato per la fusione, in qualche modo ha causato in qualche modo che Xcode fallisse nel costruire il mio progetto. Ho dovuto ripristinare la nuova impostazione del filtro FileMerge per xib, quindi Xcode creerebbe il progetto con successo. – duncanc4

+0

Quale versione di Xcode? Non ho visto questo problema (Xcode 7.3 e Xcode 8.3.3). Quel comportamento sembrerebbe essere completamente bizzarro. Il processo di compilazione normalmente non dovrebbe usare roba FileMerge, a meno che non ci siano script di build personalizzati (o regole di compilazione) che in qualche modo fanno. –

+0

Questo era con Xcode 8.3.3. – duncanc4