Kontrola wersji spakowanych plików (docx, odt)

Istnieją formaty, które w rzeczywistości są plikami zip w ukryciu, np. docx lub odt. Jeśli przechowuję je bezpośrednio w kontroli wersji, są one traktowane jako pliki binarne. Moim idealnym rozwiązaniem byłoby

  • posiada hook, który tworzy katalog foo.docx/ dla każdego pliku foo.docx przed zatwierdzeniem, rozpakowując do niego wszystkie pliki
  • opcjonalnie, mieć hook, który reindentuje pliki xml
  • mieć hook, który odtwarza foo.docx z przechowywanych plików po aktualizacji

Nie chcę docx same pliki do kontroli wersji. (Zdaję sobie sprawę z związanego z pytaniem gdzie zaproponowano inne podejście z niestandardowym rozróżnieniem.)

Czy to da się zrobić? Czy to da się zrobić z mercurialem?

Aktualizacja:

Wiem o hookach. Interesują mnie szczegóły. Oto sesja, aby zademonstrować oczekiwane zachowanie.
> hg add foo.docx
> hg status
A foo.docx
> hg commit
> # Change foo.docx with external editor
> hg status
M foo.docx
> hg diff
+++ foo.docx/word/document.xml
- <w:t>An idea</w:t>
+ <w:t>A much better idea</w:t>
Author: Community, 2010-09-22

4 answers

Jeśli uda ci się ominąć przeszkodę udanego rozpakowywania i zamykania dokumentów Openoffice, powinieneś być w stanie użyć systemu filtrów, który mamy w Mercurial. Pozwala to przekształcać pliki przy każdym odczycie/zapisie z / do repozytorium.

Będziesz niestety musiał zrobić coś więcej niż tylko rozpakować foo.plik docx. Problem polega na tym, że musisz wygenerować pojedynczy plik jako wyjście -- więc być może możesz unzip foo.docx, a następnie tar zwiększyć wygenerowane pliki. Będziesz wtedy wersjonować tarball, który powinien działać, ponieważ tarball jest tylko nieskompresowanym połączeniem wszystkich pojedynczych plików z metainformacją. Jeśli o tym pomyśleć, prostszym rozwiązaniem byłoby spakowanie rozpakowanego foo.plik docx ponownie, ale bez kompresji. To powinno dać podobne wyniki jak przy użyciu smoły.

Rozwiązanie tego problemu jest czymś, co chciałem zrobić sam, więc proszę zgłoś się, wysyłając wiadomość na Mercurial mailing list .

 5
Author: Martin Geisler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-19 12:47:13

Zastanawiałem się nad tym samym i właśnie natknąłem się na zipdoc rozszerzenie/filtr dla Mercurial, który wydaje się robić dokładnie to!

Jeszcze nie próbowałem, ale wygląda obiecująco!

 13
Author: Danny Tuppeny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-16 12:43:11

Możesz użyć haka wstępnego do rozpakowania i haka aktualizacji do zip. Zobacz the definitive guide Jak używać hooków.

Uważaj na zmianę nazwy. Jeśli zmienisz nazwę foo.docx na bar.docx, twój hook będzie musiał usunąć foo.docx/ i dodać bar.docx/.


Nie jest to jednak żaden problem, ponieważ nie jest to możliwe.]}

Jeśli chcesz użyć rozpakowanego docx do podstawowych operacji hg, takich jak diff (status może pracować z spakowanym plikiem), musisz przejść z rozszerzeniem. Myślę, że można przyjąć podobne podejście do keyword rozszerzenie Jak owinąć obiekt repo własnym.

Napisałem kilka rozszerzeń, ale nie na takim poziomie hard core, więc nie mogę podać więcej szczegółów.

Jeśli chcesz zwariować, możesz nawet połączyć się z rozpakowanym plikiem. Ale prawdopodobnie bezpieczniej jest traktować go jako binarny i używać zewnętrznego narzędzia do różnicowania i scalania.

 3
Author: Geoffrey Zheng,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:34

Zmagałem się z tym problemem przez ostatnie kilka dni i napisałem małe narzędzie. NET do wyodrębniania i normalizacji plików Excela w taki sposób, że są one znacznie łatwiejsze do przechowywania w kontroli źródeł. Opublikowałem plik wykonywalny tutaj:

Https://bitbucket.org/htilabs/ooxmlunpack/downloads/OoXmlUnpack.exe

..a źródło tutaj:

Https://bitbucket.org/htilabs/ooxmlunpack

If there 's any interest I' m happy to make this bardziej konfigurowalny, ale w tej chwili powinieneś umieścić plik wykonywalny w folderze (np. katalogu głównym repozytorium źródłowego) i kiedy go uruchomisz, będzie to:

  • przeskanuj folder i jego podfoldery w poszukiwaniu dowolnego .xlsx i .pliki xlsm
  • skopiuj plik jako *.orig
  • Rozpakuj każdy plik i rozpakuj go ponownie bez kompresji
  • Pretty-Drukuj dowolne pliki w archiwum, które są poprawne XML
  • Usuń calcchain.plik xml z archiwum (ponieważ wiele się zmienia i nie wpływa na zawartość pliku)
  • Inline dowolne nieformatowane wartości tekstowe (w przeciwnym razie są one przechowywane w tabeli wyszukiwania, która powoduje duże zmiany w wewnętrznym XML, jeśli zmodyfikowana jest nawet pojedyncza komórka)
  • Usuń wartości z dowolnych komórek zawierających formuły (ponieważ można je obliczyć po następnym otwarciu arkusza)
  • Utwórz podfolder *.extracted, zawierający zawartość archiwum zip

Najwyraźniej nie wszystkie te rzeczy są konieczne, ale efektem końcowym jest plik arkusza kalkulacyjnego, który nadal będzie otwarty w programie Excel, ale który jest znacznie bardziej podatny na różne i przyrostowe kompresje. Ponadto, przechowywanie wyodrębnionych plików, jak również sprawia, że znacznie bardziej oczywiste w historii wersji, jakie zmiany zostały zastosowane w każdej wersji.

Jeśli jest jakiś apetyt tam, jestem szczęśliwy, aby narzędzie bardziej konfigurowalne, ponieważ myślę, że nie każdy będzie chciał zawartość wyodrębnione, lub ewentualnie wartości usunięte z komórek formuły, ale oba są dla mnie bardzo przydatne w tej chwili.

W testach arkusz kalkulacyjny 2MB "rozpakowuje" się do 21MB, ale potem udało mi się zapisać pięć wersji z małymi zmianami między każdą, w pliku danych mercurial 1.9 MB i wizualizować różnice między wersjami skutecznie za pomocą Beyond Compare w trybie tekstowym.

 0
Author: Jon G,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-10 15:39:29