Вход | Регистрация
 

Версионирование файлов v2

Версионирование файлов v2
Я
   E-rsh_KUS
 
03.08.21 - 11:32
В продолжении темы от ildary Версионирование файлов
Нужна именно такая фича, раньше был DropBox и было очень удобно, во внешней обработке что то слетело - а ты раз старую версию поднял и посмотрел/доказал что ты не жираф и пр.
Но нужно именно локально. Пробовал в Windows 10 включить версионность, но он их делает не пойми когда (и 100% не после каждого сохранения файла). Если можно винду как то настроить - буду рад помощи.
Гугл уже достаточно копал - пока без результатов.
   Aleksey
 
1 - 03.08.21 - 11:47
гит?
   E-rsh_KUS
 
2 - 03.08.21 - 11:52
(1) гит на автомате может делать пуши?
Нажал в 1С сохранить обработку (могу и через закрытие её, чтоб освободить) - а он сам сделал версию?
Мне как таковой diff не нужен между версиями (да и в обработках она не сильно поможет, если не заморачиваться с xml)
   Garykom
 
3 - 03.08.21 - 11:59
(0) почитай ближе к концу ветки DevOps инструменты для платформы 1С
   E-rsh_KUS
 
4 - 03.08.21 - 12:33
(3) Не увидел там решения проблемы. Дедубликация - это по простому просто сжатие данных. А предложение всяких Zfs это конечно здорово, но Win 10, да и не хочется так глобально заморачиваться, ради простого резервного копирования по событию. В теории, это должен быть демон/служба которая через хуки следит за изменением файлов и делает резервные копии, или дергает какие то функции винды принудительного создания версии файлов.

Еще раз повторю, у Win10 есть версионность, но я не могу понять как она и когда работает. Поставил в параметрах архивации (именно там хранятся другие настройки архивации/версионности) архивировать каждые 15 минут, но всё равно старые версии у каких то файлов есть, у каких то нет, хотя точно пересохранял. Можно конечно натравить на это winrar и через батник там накидать ключей, вроде около того он можен, но это такой геморой.... А в DropBox было все просто и удобно
   Злопчинский
 
5 - 03.08.21 - 12:50
По идее это можно замутить через Снегопат или аналогичные автоматизации конфигуратора
   E-rsh_KUS
 
6 - 03.08.21 - 12:54
По версионности win10, результаты тестов показали, что если файл открыт и был изменен, он не попадет в версионность пока не закрыть (в отличии от dropbox). Но похоже цикл бекапа идет в "попытке" поэтому никаких ошибок, а просто молчком. НЕНАВИЖУ подобное использование попыток.
   E-rsh_KUS
 
7 - 03.08.21 - 13:20
В интернете случайно нашел вот такую статью, в комментах есть много чего полезного, в .т.ч. про альтернативные проги  https://www.outsidethebox.ms/18432/
   Злопчинский
 
8 - 03.08.21 - 13:25
(6) Переходи на 77, там есть патч от Ромикса, который при каждом сохранении обработки в конфигураторе делает бэкап
   fisher
 
9 - 03.08.21 - 13:27
(2) Сам не может. Гит как таковой - достаточно низкоуровневый инструмент. Но заскриптовать автопуш по идее не должно стать проблемой. Пусть не по событию, но по регламенту тоже норм будет. Те, кто разработку ведет через гит обычно внешние обработки тоже через гит версионируют в отдельном репозитории. Только пушат осознанно. И честно говоря необходимости в автопушах я не вижу. Удобно же, когда можно будет видеть осознанно описанные коммиты, а не тупой список автосохранений.
   fisher
 
10 - 03.08.21 - 13:30
Только обычно используют доп-инструменты, чтобы обработки в гите держать "препарированными" (разложенные по файликам, как конфу).
   ildary
 
11 - 03.08.21 - 14:56
(0) я недавно писал на AutoIt утилиту, которая мониторит изменения в папке и создает копию файла в отдельную папку. Могу посмотреть, как она себя ведёт на последней Win10.
   E-rsh_KUS
 
12 - 03.08.21 - 15:33
(11) AutoIt говоришь... интересно. Нужно посмотреть. А там есть отдельная функция мониторинга или проверка по циклу даты изменения ?
   E-rsh_KUS
 
13 - 03.08.21 - 15:36
(9) Я работаю практически соло, да и где не соло, все равно обработки обычно делятся. А тратить доп. время на коммиты (да и за частую поправил тут немного, там...), в общем лениво :)
   ildary
 
14 - 03.08.21 - 15:49
(12) AutoIt - это что-то вроде VBA для сисадмина, хороша тем, что библиотек написано на все случаи жизни. Я посмотрел свою старую разработку - она уже не работает под Win10, нашёл другую библиотеку, смотрю, что она умеет. Вот примерный список отлавливаемых событий:

$FILE_NOTIFY_CHANGE_FILE_NAME
$FILE_NOTIFY_CHANGE_DIR_NAME
$FILE_NOTIFY_CHANGE_ATTRIBUTES
$FILE_NOTIFY_CHANGE_SIZE
$FILE_NOTIFY_CHANGE_LAST_WRITE
$FILE_NOTIFY_CHANGE_LAST_ACCESS
$FILE_NOTIFY_CHANGE_CREATION
$FILE_NOTIFY_CHANGE_SECURITY
   mistеr
 
15 - 03.08.21 - 15:55
(4) FreeFileSync умеет мониторить изменения файлов и запускать бэкап.
   ildary
 
16 - 03.08.21 - 16:02
(15) FreeFileSync делает бекап в стиле создания отдельной новой копии файла или простая синхронизация с другой папкой без новой копии типа ДатаВремяИмяФайла? Я им когда-то пользовался, пока не наткнулся на Syncthing.
   mistеr
 
17 - 03.08.21 - 16:04
(16) Синхронизацию, не бэкап. Но запускать по событию можно что угодно.
   ildary
 
18 - 03.08.21 - 16:06
Вот работающий код, для него потребуется библиотека RDC.au3 и файлы RDC.dll или RDC_x64.dll, которые брать надо тут: https://www.autoitscript.com/forum/applications/core/interface/file/attachment.php?id=53030, сама страница библиотеки: https://www.autoitscript.com/forum/topic/167024-rdc-udf-readdirectorychanges-wrapper

Собственно вот код утилиты (проверил, работает под Win10 20H2), код не ругать, писал из горящего танка:

#include <File.au3>
#include <Misc.au3> ; _Singleton
#Include <APIConstants.au3>
#Include <RDC.au3>

; https://www.autoitscript.com/forum/topic/167024-rdc-udf-readdirectorychanges-wrapper/

#AutoIt3Wrapper_icon=1c.ico

Dim $MonitorFolder = "D:\_My\"
Dim $SaveFolder    = "D:\_My\Я_СТАРОЕ\"
Dim $ExtensionsToMonitor = "erf epf txt xml" ; звездочки нельзя :(
    $ExtensionsToMonitor = StringLower($ExtensionsToMonitor)
Dim $ExtensionsSkip         = "" ; звездочки нельзя :(

_Main()

Func _Main()

   If _Singleton(@ScriptName, 1) = 0 Then Exit

   ReadCfg()

    _RDC_OpenDll()
    If @Error Then
        ConsoleWrite('Error: _RDC_OpenDll() - ' & @Error & @CR)
        Exit
    EndIf

;~ ConsoleWrite('$MonitorFolder: ' & $MonitorFolder & @CR)
   $ID = _RDC_Create($MonitorFolder, 1, BitOR($FILE_NOTIFY_CHANGE_FILE_NAME, $FILE_NOTIFY_CHANGE_DIR_NAME, $FILE_NOTIFY_CHANGE_SIZE))
    If @Error Then
        ConsoleWrite('Error: _RDC_Create() - ' & @Error & ', ' & @Extended & @CR)
        Exit
    EndIf

   While 1 ; Main Loop

        If $ID = -1 Then
            ContinueLoop
        EndIf

        $aData = _RDC_GetData($ID)
        If @Error Then

            ConsoleWrite('Error: _RDC_GetData() - ' & @Error & ', ' & @Extended & ', ' & _RDC_GetDirectory($ID) & @CR)

            _RDC_Delete($ID) ; Delete thread to avoid receiving this error!
            $ID = -1
            ContinueLoop

        EndIf

        For $j = 1 To $aData[0][0]

;~ ConsoleWrite($aData[$j][1] & ' - ' & _RDC_GetDirectory($ID) & '\' & $aData[$j][0] & @CR)
            $FileFullName = _RDC_GetDirectory($ID) & '\' & $aData[$j][0]
            BackupFile($FileFullName)

        Next

      Sleep(500)

   WEnd

EndFunc

Func BackupFile($FileFullName)
Local $sDrive, $sDir, $sFileName, $sExtension

ConsoleWrite("$FileFullName: " & $FileFullName & @CRLF)

   If Not FileExists($FileFullName) Then

      ConsoleWrite("!Not exist: " & $FileFullName & @CRLF)
      Return

   EndIf

   $sAttribute = FileGetAttrib($FileFullName)
   If StringInStr($sAttribute, "D") <> 0 Then
      ConsoleWrite("!It's folder: " & $FileFullName & @CRLF)
      Return ; папка
   EndIf

   _PathSplit($FileFullName, $sDrive, $sDir, $sFileName, $sExtension)

   $sFileName  = $sFileName & $sExtension
   $sExtension = StringRight($sExtension, StringLen($sExtension) - 1)
   If ($ExtensionsToMonitor <> "*") And (StringInStr($ExtensionsToMonitor, StringUpper($sExtension)) = 0) Then

      ConsoleWrite("!Bad extension: " & $sExtension & @CRLF)
      Return

   EndIf

   $sDir = $sDrive & $sDir
;~ ConsoleWrite("$sDir: " & $sDir & @CRLF)

   If StringInStr($sDir, $SaveFolder) <> 0 Then Return
   $SaveDir = $SaveFolder & StringRight($sDir, StringLen($sDir) - 3)
ConsoleWrite("$SaveDir: " & $SaveDir & @CRLF)

   DirCreate($SaveDir)
   If Not FileExists($SaveDir) Then

      ConsoleWrite("!Not exist: " & $SaveDir & @CRLF)
      Return

   EndIf

   $sFileName = "" & @YEAR & "-" & @MON & "-" &  @MDAY & " " & @HOUR & "-" & @MIN & "-" & @SEC & " " & $sFileName
   FileCopy($FileFullName, $SaveDir & $sFileName, 1)

EndFunc

Func ReadCfg()

   $CfgFileName = @ScriptName
   $CfgFileName = @ScriptDir & "\" & StringLeft($CfgFileName, StringInStr($CfgFileName, ".") - 1) & ".cfg"

   If Not FileExists($CfgFileName) Then

      MsgBox(4096, "Ошибка", "Файл настроек не существует: " & $CfgFileName)
      Exit

   EndIf

    $PassFile = FileOpen($CfgFileName, $FO_ANSI)
    If $PassFile = -1 Then

      MsgBox(4096, "Ошибка", "Не могу открыть файл настроек: " & $CfgFileName)
      Exit

   EndIf

   $MonitorFolder = FileReadLine($PassFile)
   If @error = -1 Then

      MsgBox(4096, "Ошибка", "Не получена папка проверки!")
      Exit

   EndIf

   $Pos =  StringInStr($MonitorFolder, "//")
   If $Pos <> 0 Then $MonitorFolder = StringLeft($MonitorFolder, $Pos - 1)
   $MonitorFolder = StringStripWS($MonitorFolder, 1 + 2)
   If Not FileExists($MonitorFolder) Then

      MsgBox(4096, "Ошибка", "Папка проверки не существует: " & $MonitorFolder)
      Exit

   EndIf

   $SaveFolder = FileReadLine($PassFile)
   If @error = -1 Then

      MsgBox(4096, "Ошибка", "Не получена папка архивов!")
      Exit

   EndIf

   $Pos =  StringInStr($SaveFolder, "//")
   If $Pos <> 0 Then $SaveFolder = StringLeft($SaveFolder, $Pos - 1)
   $SaveFolder = StringStripWS($SaveFolder, 1 + 2)
   If Not FileExists($SaveFolder) Then

        DirCreate($SaveFolder)
        If Not FileExists($SaveFolder) Then

              MsgBox(4096, "Ошибка", "Папка архивов не существует: " & $SaveFolder)
              Exit

        EndIf

   EndIf

   If StringRight($SaveFolder, 1) <> "\" Then $SaveFolder = $SaveFolder & "\"

   $Str = FileReadLine($PassFile)
   If @error = -1 Then Return

   $Pos =  StringInStr($Str, "//")
   If $Pos <> 0 Then $Str = StringLeft($Str, $Pos - 1)
   $Str = StringStripWS($Str, 1 + 2)
   If $Str = "" Then Return

   $ExtensionsToMonitor = StringUpper($Str)

EndFunc ; ReadLastPasswords
   Йохохо
 
19 - 03.08.21 - 16:22
   Йохохо
 
20 - 03.08.21 - 16:23
работает по локалке
   Сармат
 
21 - 03.08.21 - 16:33
(0) OneDrive, работает как часы. Заодно это еще и бекап в облаке. Двух зайцев одним выстрелом. Встроен в систему по родному. Обкатан годами.
   ildary
 
22 - 03.08.21 - 16:34
(19) хорошая штука, сам пользуюсь, но для задачи (0) есть одно неудобство (возможно неважное) - копии будут создаваться на другом компьютере.
   МихаилМ
 
23 - 03.08.21 - 16:52
wmi   умеет отлавливать события записи в файл      со времен win nt 4.0
   Aleksey
 
24 - 03.08.21 - 17:10


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.