[{"data":1,"prerenderedAt":560},["ShallowReactive",2],{"blog-post-/blog/wersjonowanie-skryptow-dynamo-grasshopper":3},{"id":4,"title":5,"body":6,"date":550,"description":551,"extension":552,"lang":553,"meta":554,"navigation":555,"path":556,"seo":557,"stem":558,"__hash__":559},"blog_pl/blog/wersjonowanie-skryptow-dynamo-grasshopper.md","Wersjonowanie skryptów Dynamo i Grasshopper. Który plik jest aktualny?",{"type":7,"value":8,"toc":535},"minimark",[9,26,36,39,44,47,51,60,71,75,119,135,147,151,159,204,213,217,229,238,260,264,276,295,299,310,365,369,377,382,385,389,397,401,414,479,495,499,502,521,524,531],[10,11,12,13,17,18,21,22,25],"p",{},"Niestety… nazwy ",[14,15,16],"code",{},"final",", ",[14,19,20],{},"final2"," i ",[14,23,24],{},"ostateczna_poprawiona"," nie tworzą historii zmian. Historia pliku pokazuje zapisane zmiany i ich autorów. Numer wersji wskazuje, jak zmiana wpływa na osoby korzystające ze skryptu Dynamo, definicji Grasshoppera albo wtyczki.",[27,28,34],"pre",{"className":29,"code":31,"language":32,"meta":33},[30],"language-text","zestawienia_final.dyn\nzestawienia_final2.dyn\nzestawienia_STARE_DZIALA.dyn\n","text","",[14,35,31],{"__ignoreMap":33},[10,37,38],{},"Który plik zawiera ostatnią poprawkę, kto ją wprowadził i jak wrócić do poprzedniego stanu?",[40,41,43],"h2",{"id":42},"najpierw-ustal-od-którego-pliku-zaczynasz-historię","Najpierw ustal, od którego pliku zaczynasz historię",[10,45,46],{},"Zrób kopię folderu i porównaj pliki. Przy każdej różnicy zapisz, co się zmieniło i która kopia ją zawiera. Jeżeli potrafisz potwierdzić kolejność zmian, wprowadź kolejne stany do repozytorium. Jeśli nie, rozpocznij historię od ostatniego sprawdzonego pliku. Starsze kopie zachowaj w archiwum z informacją, czego nie udało się ustalić.",[40,48,50],{"id":49},"git-zapisuje-kolejne-stany-pliku","Git zapisuje kolejne stany pliku",[10,52,53,54,59],{},"Rozwiązaniem jest folder, w którym Git zapisuje kolejne zmiany. Taki folder to ",[55,56,58],"glossary-term",{"term-key":57},"repozytorium","repozytorium Git",". Możesz przechowywać go na GitHubie, aby autorzy korzystali z tej samej historii zmian i mieli jej kopię poza jednym komputerem.",[10,61,62,63,70],{},"Każdy zapis ma autora, datę i opis. Można porównać go z wcześniejszym stanem albo przywrócić starszą wersję. ",[64,65,69],"a",{"href":66,"rel":67},"https://git-scm.com/book/pl/v2/Podstawy-Gita-Rejestrowanie-zmian-w-repozytorium.html",[68],"nofollow","Polskie tłumaczenie Pro Git pokazuje, jak Git zapisuje zmiany w repozytorium",".",[40,72,74],{"id":73},"format-pliku-wpływa-na-to-jakie-szczegóły-zmiany-zobaczysz","Format pliku wpływa na to, jakie szczegóły zmiany zobaczysz",[76,77,78,91],"table",{},[79,80,81],"thead",{},[82,83,84,88],"tr",{},[85,86,87],"th",{},"Format",[85,89,90],{},"Co pokaże Git",[92,93,94,109],"tbody",{},[82,95,96,106],{},[97,98,99,102,103],"td",{},[14,100,101],{},".dyn"," od wersji 2.0 i ",[14,104,105],{},".ghx",[97,107,108],{},"To pliki tekstowe. Git może wskazać zmienione fragmenty, ale sam zapis różnic nie zawsze jasno pokazuje, co zmieniło się w działaniu skryptu.",[82,110,111,116],{},[97,112,113],{},[14,114,115],{},".gh",[97,117,118],{},"To plik binarny. Git zapisze jego kolejne stany, ale pokaże tylko, że cały plik się zmienił.",[10,120,121,122,124,125,127,128,70],{},"Jeżeli chcesz porównywać zmiany, wybierz ",[14,123,105],{}," jako plik źródłowy. Binarny ",[14,126,115],{}," możesz nadal przygotowywać dla użytkowników, ale nie utrzymuj dwóch niezależnie edytowanych kopii. ",[64,129,132,133],{"href":130,"rel":131},"https://discourse.mcneel.com/t/purpose-of-ghx/118702/2",[68],"Zespół McNeel wskazuje porównywanie zmian jako jedno z zastosowań formatu ",[14,134,105],{},[10,136,137,138,140,141,146],{},"Od wersji 2.0 Dynamo zapisuje pliki ",[14,139,101],{}," w formacie JSON. ",[64,142,145],{"href":143,"rel":144},"https://dynamobim.org/to-dynamo-2-0-and-beyond/",[68],"Twórcy Dynamo opisują zmianę formatu w Dynamo 2.0",". Zmiana położenia wielu węzłów może jednak tworzyć duży, mało czytelny diff mimo niewielkiej zmiany logiki.",[40,148,150],{"id":149},"numer-majorminorpatch-opisuje-skutek-zmiany","Numer major.minor.patch opisuje skutek zmiany",[10,152,153,154,158],{},"Numer w układzie ",[55,155,157],{"term-key":156},"semver","major.minor.patch"," nie zastępuje historii Gita, ale daje użytkownikowi krótką informację, czy zmienił się sposób pracy ze skryptem.",[76,160,161,171],{},[79,162,163],{},[82,164,165,168],{},[85,166,167],{},"Numer",[85,169,170],{},"Znaczenie",[92,172,173,184,194],{},[82,174,175,181],{},[97,176,177],{},[178,179,180],"strong",{},"major · 2.0.0",[97,182,183],{},"Dotychczasowy sposób użycia przestaje działać, na przykład skrypt wymaga innych danych wejściowych albo zwraca wynik w innym formacie. Zespół musi zmienić sposób pracy.",[82,185,186,191],{},[97,187,188],{},[178,189,190],{},"minor · 1.7.0",[97,192,193],{},"Dochodzi nowa funkcja, ale dotychczasowy sposób użycia nadal działa.",[82,195,196,201],{},[97,197,198],{},[178,199,200],{},"patch · 1.6.3",[97,202,203],{},"Poprawka usuwa błąd bez zmiany obsługi i oczekiwanego wyniku.",[10,205,206,207,212],{},"Zasady numerowania opisuje ",[64,208,211],{"href":209,"rel":210},"https://semver.org/lang/pl/",[68],"polska wersja Semantic Versioning 2.0.0",". Dla skryptu używanego w pracowni trzeba jeszcze zapisać, co użytkownik uznaje za zmianę zgodną z dotychczasowym sposobem pracy.",[40,214,216],{"id":215},"tag-łączy-numer-wersji-z-konkretnym-stanem-pliku","Tag łączy numer wersji z konkretnym stanem pliku",[10,218,219,220,224,225,228],{},"Po sprawdzeniu skryptu oznaczasz konkretny punkt historii ",[55,221,223],{"term-key":222},"git-tag","tagiem",", na przykład ",[14,226,227],{},"v1.6.2",". Dzięki temu numer prowadzi do dokładnie tych plików, które przeszły test.",[10,230,231,232,237],{},"Do tagu możesz dołączyć stronę z opisem zmian i plikami do pobrania. GitHub nazywa ją ",[64,233,236],{"href":234,"rel":235},"https://docs.github.com/en/repositories/releasing-projects-on-github/about-releases",[68],"Release",". W małej bibliotece skryptów taki zestaw zwykle wystarcza do udostępniania sprawdzonych wersji.",[10,239,240,241,246,247,250,251,259],{},"W repozytorium GitHub możesz dodać workflow ",[64,242,245],{"href":243,"rel":244},"https://docs.github.com/en/actions/get-started/quickstart",[68],"GitHub Actions",", który po wprowadzeniu zmian do głównej gałęzi uruchamia ",[14,248,249],{},"semantic-release",". Narzędzie odczytuje komunikaty commitów zapisane według ustalonej konwencji i na tej podstawie określa, czy zwiększyć numer major, minor czy patch, a następnie tworzy tag i GitHub Release. ",[64,252,255,256,258],{"href":253,"rel":254},"https://semantic-release.gitbook.io/semantic-release/recipes/ci-configurations/github-actions",[68],"Dokumentacja ",[14,257,249],{}," pokazuje gotową konfigurację dla GitHub Actions",". Dzięki temu skrypty są wersjonowane automatycznie, ale poprawny numer nadal zależy od konsekwentnych komunikatów commitów.",[40,261,263],{"id":262},"yak-wersjonuje-pakiet-nie-historię-definicji-grasshopper","Yak wersjonuje pakiet, nie historię definicji Grasshopper",[10,265,266,267,271,272,275],{},"Git zapisuje historię plików źródłowych. ",[55,268,270],{"term-key":269},"yak","Pakiet Yak"," zawiera gotową wtyczkę, autorskie komponenty i plik ",[14,273,274],{},"manifest.yml"," z numerem wersji. Rhino Package Manager może później zainstalować ten pakiet na komputerze użytkownika.",[10,277,278,283,284,286,287,289,290,70],{},[64,279,282],{"href":280,"rel":281},"https://developer.rhino3d.com/en/guides/yak/creating-a-grasshopper-plugin-package/",[68],"McNeel pokazuje budowanie wersjonowanego pakietu dla wtyczki Grasshopper",". To dobry sposób dystrybucji autorskich komponentów, ale nie zamiennik Gita dla kolejnych stanów pliku ",[14,285,115],{}," lub ",[14,288,105],{},". ",[64,291,294],{"href":292,"rel":293},"https://primer2.dynamobim.org/1_developer_primer_intro/3_developing_for_dynamo/4_publish_a_package",[68],"Dynamo Package Manager pełni podobną rolę dla pakietów Dynamo",[40,296,298],{"id":297},"jedna-wersja-wtyczki-może-mieć-osobne-pliki-dla-kilku-środowisk-uruchomieniowych","Jedna wersja wtyczki może mieć osobne pliki dla kilku środowisk uruchomieniowych",[10,300,301,302,305,306,309],{},"Wtyczka ",[14,303,304],{},"1.6.2"," może mieć osobny plik skompilowany dla każdego wspieranego środowiska uruchomieniowego. Taki plik to ",[55,307,308],{"term-key":308},"build",". Wszystkie buildy mogą należeć do jednej wersji funkcjonalnej, o ile realizują ten sam zakres. Nazwa gotowej paczki powinna wskazywać program, a tag w Git pozostaje wspólny.",[76,311,312,325],{},[79,313,314],{},[82,315,316,319,322],{},[85,317,318],{},"Narzędzie",[85,320,321],{},"Plik dla użytkownika",[85,323,324],{},"Wersja",[92,326,327,340,352],{},[82,328,329,332,337],{},[97,330,331],{},"Dodatek Revit",[97,333,334],{},[14,335,336],{},"narzedzie-r24-1.6.2.zip",[97,338,339],{},"1.6.2 · Revit 2024",[82,341,342,344,349],{},[97,343,331],{},[97,345,346],{},[14,347,348],{},"narzedzie-r25-1.6.2.zip",[97,350,351],{},"1.6.2 · Revit 2025",[82,353,354,357,362],{},[97,355,356],{},"Wtyczka Rhino",[97,358,359],{},[14,360,361],{},"geometria-2.3.0-rh8-win.yak",[97,363,364],{},"2.3.0 · Rhino 8",[40,366,368],{"id":367},"praktyczny-setup","Praktyczny setup",[10,370,371,372,224,374,376],{},"Chodzi o numer ",[14,373,157],{},[14,375,304],{},". Ten sam numer powinien wskazywać sprawdzony stan repozytorium oraz wszystkie pliki przygotowane z tego stanu dla użytkowników.",[378,379,381],"h3",{"id":380},"pliki-dynamo-i-grasshopper","Pliki Dynamo i Grasshopper",[10,383,384],{},"Pliki trafiają do repozytorium. Po teście tworzysz tag i dołączasz sprawdzony plik do GitHub Release. Package Manager nie jest potrzebny, dopóki nie publikujesz osobnego pakietu z autorskimi węzłami lub komponentami.",[378,386,388],{"id":387},"revit","Revit",[10,390,391,396],{},[64,392,395],{"href":393,"rel":394},"https://github.com/Nice3point/RevitTemplates",[68],"Nice3point/RevitTemplates"," utrzymuje wiele konfiguracji Revita w jednym projekcie i automatyzuje wersjonowanie na podstawie historii Git. Jedna wersja produktu tworzy osobne buildy dla wskazanych wersji Revita.",[378,398,400],{"id":399},"rhino","Rhino",[10,402,403,404,286,407,410,411,413],{},"W folderze z gotową wtyczką ",[14,405,406],{},".rhp",[14,408,409],{},".gha"," zapisujesz plik ",[14,412,274],{}," z nazwą i wersją pakietu:",[27,415,419],{"className":416,"code":417,"language":418,"meta":33,"style":33},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","name: narzedzie-biura\nversion: 1.6.2\nauthors:\n  - Pracownia\ndescription: Narzędzia do kontroli modelu\n","yaml",[14,420,421,438,450,459,468],{"__ignoreMap":33},[422,423,426,430,434],"span",{"class":424,"line":425},"line",1,[422,427,429],{"class":428},"swJcz","name",[422,431,433],{"class":432},"sMK4o",":",[422,435,437],{"class":436},"sfazB"," narzedzie-biura\n",[422,439,441,444,446],{"class":424,"line":440},2,[422,442,443],{"class":428},"version",[422,445,433],{"class":432},[422,447,449],{"class":448},"sbssI"," 1.6.2\n",[422,451,453,456],{"class":424,"line":452},3,[422,454,455],{"class":428},"authors",[422,457,458],{"class":432},":\n",[422,460,462,465],{"class":424,"line":461},4,[422,463,464],{"class":432},"  -",[422,466,467],{"class":436}," Pracownia\n",[422,469,471,474,476],{"class":424,"line":470},5,[422,472,473],{"class":428},"description",[422,475,433],{"class":432},[422,477,478],{"class":436}," Narzędzia do kontroli modelu\n",[10,480,481,482,485,486,489,490,70],{},"Polecenie ",[14,483,484],{},"yak build"," tworzy wersjonowany pakiet. Tag dystrybucji, na przykład ",[14,487,488],{},"rh8-win",", wskazuje zgodną wersję Rhino i system. ",[64,491,494],{"href":492,"rel":493},"https://developer.rhino3d.com/guides/yak/the-anatomy-of-a-package/",[68],"Jeden numer pakietu może mieć kilka wariantów dla różnych wersji Rhino",[40,496,498],{"id":497},"minimalny-proces","Minimalny proces",[10,500,501],{},"Jedna sprawdzona wersja wskazuje jeden stan repozytorium:",[503,504,505,509,512,518],"ol",{},[506,507,508],"li",{},"Zapisuj pliki skryptu i kod w jednym repozytorium Git.",[506,510,511],{},"Opisuj każdą zmianę krótko i konkretnie.",[506,513,514,515,517],{},"Po teście nadaj numer ",[14,516,157],{}," i tag wskazujący sprawdzony stan.",[506,519,520],{},"Udostępnij zespołowi ten stan przez GitHub Release, folder sprawdzonych skryptów albo wersjonowany pakiet.",[10,522,523],{},"Większość tych czynności może wykonać agent AI pracujący w repozytorium, na przykład Codex albo Claude Code. Możesz też użyć aplikacji desktopowej, jeśli ma dostęp do plików projektu i Gita. Agent przygotuje opisy zmian, tag i paczkę, ale to autor narzędzia decyduje, który stan przeszedł test.",[10,525,526,527,70],{},"Numer wersji opisuje zmianę skryptu. ",[64,528,530],{"href":529},"/blog/zgodnosc-skryptow-po-aktualizacji-revit-rhino","Zgodność z konkretną wersją Revita lub Rhino wymaga osobnego zapisu i testu",[532,533,534],"style",{},"html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":33,"searchDepth":440,"depth":440,"links":536},[537,538,539,540,541,542,543,544,549],{"id":42,"depth":440,"text":43},{"id":49,"depth":440,"text":50},{"id":73,"depth":440,"text":74},{"id":149,"depth":440,"text":150},{"id":215,"depth":440,"text":216},{"id":262,"depth":440,"text":263},{"id":297,"depth":440,"text":298},{"id":367,"depth":440,"text":368,"children":545},[546,547,548],{"id":380,"depth":452,"text":381},{"id":387,"depth":452,"text":388},{"id":399,"depth":452,"text":400},{"id":497,"depth":440,"text":498},"2026-09-02","Jak zastąpić pliki final2 historią zmian, numerami major.minor.patch i sprawdzonymi wersjami dla zespołu.","md","pl",{},true,"/blog/wersjonowanie-skryptow-dynamo-grasshopper",{"title":5,"description":551},"blog/wersjonowanie-skryptow-dynamo-grasshopper","DVA1b1wBISLE7MY5Sntb9ioDlH2r1t28DBTjarMlqrc",1788341116145]