Подверсия: предотвратить локальные модификации в один файл от того, чтобы быть фиксировавшимся?

Форматирование одинаковых ячеек
  • Загрузка рабочей книги (Dropbox)
  • Примерное (неточное) описание: этот код не проверяет первые рабочие листы для [ 112] цветов, он скорее проверяет Min и Max Criteria для каждой ячейки и применяет форматирование, в то время как подсчитывает количество вхождений критериев, встречающихся в списке, который затем проверяется по количеству первых рабочих листов, и если найдены, соответствующие ячейки в последнем листе форматируются.
  • Вы можете добавить больше рабочих листов в список имен рабочих листов (cSheets), но ячейки в диапазоне всех, кроме последней рабочей таблицы, будут отформатированы, если критерии удовлетворены, а ячейки в диапазоне последней лист будет отформатирован, только если все ячейки в диапазонах всех предыдущих листов соответствуют критериям.
  • Настройте другие значения в разделе констант, как считаете нужным.

Код

Sub FormatSameCells()

    ' Worksheet Name List
    Const cSheets As String = "Sheet1,Sheet2,Sheet3,Sheet4,Sheet5"
    Const cRange As String = "B2:BJ26"  ' Source Range Address
    Const cMax As Long = 28             ' Max Criteria
    Const cMin As Long = 1              ' Min Criteria
    Const cColor As Long = 65280        ' Cell Color (Green)

    Dim rng As Range      ' Source Range, Target Range
    Dim vntS As Variant   ' Sheet Array
    Dim vntR As Variant   ' Range Array
    Dim vntT As Variant   ' Target Array
    Dim NoS As Long       ' Number of Sheets
    Dim NoR As Long       ' Number of Rows in Source Range
    Dim NoC As Long       ' Number of Columns in Source Range
    Dim i As Long         ' Range/Target Array Row Counter
    Dim j As Long         ' Sheet Array Element Counter,
                          ' Range/Target Array Column Counter
    Dim m As Long         ' Sheet Array Element Counter
    Dim str1 As String    ' Debug String

    ' Copy Worksheet Name List to 1D 0-based Sheet Array.
    vntS = Split(cSheets, ",")
    ' Calculate Number of Worksheets).
    NoS = UBound(vntS)

    With ThisWorkbook.Worksheets(Trim(vntS(UBound(vntS)))).Range(cRange)
        ' Calculate Number of Rows in Source Range/Range Array/Target Array.
        NoR = .Rows.Count
        ' Calculate Number of Columns in Source Range/Range Array/Target Array.
        NoC = .Columns.Count
    End With

    ' Adjust Target Array to size of Source Range/Range Array.
    ReDim vntT(1 To NoR, 1 To NoC) As Long

    ' Loop through all elements of Sheet Array, except the last one.
    For m = 0 To NoS - 1
        ' Create a reference to current Source Range.
        Set rng = ThisWorkbook.Worksheets(Trim(vntS(m))).Range(cRange)
        ' Clear Interior formatting in current Source Range.
        rng.Cells.Interior.ColorIndex = xlNone
        ' Copy Source Range in current worksheet (m) to 2D 1-based 1-column
        ' array in Array Array.
        vntR = rng
        ' Loop through rows of current array of Array Array.
        For i = 1 To NoR
            ' Loop through columns of current array of Array Array.
            For j = 1 To NoC
                ' Check value of current element of current array of
                ' Array Array for matching criteria.
                If vntR(i, j) > cMin And vntR(i, j) < cMax Then
                    ' Apply formatting to current cell in current Source Range.
                    rng.Cells(i, j).Interior.Color = cColor
                    ' Increase the number in current cell of Target Array.
                    vntT(i, j) = vntT(i, j) + 1
                End If
            Next
        Next
    Next

    ' Display contents of Target Array.
    str1 = String(40, "*") & vbCr & "Target Array [" & NoR & "," & NoC & "]" _
            & vbCr & String(40, "*")
    For i = 1 To NoR
        str1 = str1 & vbCr
        For j = 1 To NoC
            str1 = str1 & vntT(i, j)
        Next
    Next
    Debug.Print str1

    ' Create a reference to last (NoS) worksheet.
    Set rng = ThisWorkbook.Worksheets(Trim(vntS(NoS))).Range(cRange)
    ' Clear formatting in Target Range.
    With rng.Cells
        .Interior.ColorIndex = xlNone
        '.Font.Bold = False
    End With
    ' Loop through rows of Target Array.
    For i = 1 To NoR
        ' Loop through columns of Target Array
        For j = 1 To NoC
            ' Check if value of current element is equal to NoS.
            If vntT(i, j) = NoS Then
                ' Apply formatting to current cell in Target Range.
                With rng.Cells(i, j)
                    .Interior.Color = cColor
                    '.Font.Bold = True
                End With
            End If
        Next
    Next

End Sub

Очистить интерьер во всех листах

Sub ClearInterior()

    Dim ws As Worksheet

    For Each ws In ThisWorkbook.Worksheets
        ws.Cells.Interior.ColorIndex = xlNone
    Next

End Sub
36
задан Community 23 May 2017 в 12:17
поделиться

10 ответов

Было несколько ответов, которые могут сработать:

  1. Создайте сценарий ловушки перед фиксацией, который отклоняет фиксацию при добавлении определенного свойства. Затем вы можете добавить это свойство к файлам в рабочей копии, чтобы предотвратить коммиты.
  2. TortoiseSVN исключает файлы из специального списка изменений «игнорировать при фиксации». Однако это не соблюдается клиентом командной строки SVN.

CoverosGene предположил, что команды по умолчанию, такие как svn commit , работают со списком изменений по умолчанию, так что вы можете исключить файл, если назначите его в другой список изменений, но я не могу найти упоминания об этом в документации, и в моем тестировании это не работает .

Поскольку нет хорошего решения для клиента командной строки SVN, Я открыл запрос на улучшение здесь .

17
ответ дан 27 November 2019 в 06:01
поделиться

Фактически сценарий предварительной фиксации выполнит эту работу.

Напишите сценарий предварительной фиксации, который выполняет 'svnlook diff' и отклоняет фиксацию, если в наборе изменений задано свойство с именем 'nocommit'.

Затем, в вашей рабочей копии вы можете просто установить свойство nocommit для любого файла, который не должен быть зафиксирован. Любая последующая фиксация завершится ошибкой, если какой-либо файл имеет свойство nocommit. Если позже вам все-таки понадобится зафиксировать изменения в файле, все, что вам нужно сделать, это удалить свойство nocommit из вашей рабочей копии.

5
ответ дан 27 November 2019 в 06:01
поделиться

Если вы работаете в Windows, используйте TortoiseSVN. Вы можете добавлять файлы в специальный список изменений «игнорировать при фиксации» , который ведет себя точно так, как вы описали.

2
ответ дан 27 November 2019 в 06:01
поделиться

Блокировка определенно не то, что вам нужно, и я не думаю, что какие-либо встроенные функции сделают это за вас.

В зависимости от того, в какой среде вы работаете, я Я бы написал сценарий, который:

  1. Получает список файлов
  2. Удаляет те, которые я не хочу фиксировать
  3. Фиксирует файлы

Что-то вроде:

svn status | grep ^M | grep -v exclude.c | awk -F' ' '{print $2}' | xargs svn ci -m "I'm committing something"

Или если список файлов действительно статичен, просто исправьте список!

2
ответ дан 27 November 2019 в 06:01
поделиться

Создайте список изменений с этим файлом в нем, а затем просто не обращайте внимания на список изменений. Файл будет находиться в ожидании фиксации, но ваши обычные коммиты, которые работают со списком изменений по умолчанию, никогда его не заберут.

svn changelist mylocal file1

создаст список изменений с именем mylocal и назначит файл file1 к нему.

8
ответ дан 27 November 2019 в 06:01
поделиться

Этот вопрос находится в FAQ по Subversion . Но ответ не очень полезен, если вы не контролируете репозиторий.

Возможно, попробуйте управлять своей локальной копией с помощью git поверх Subversion. Доступен простой курс для git . Затем вы можете использовать git-svn для отслеживания изменений в репозитории svn и для фиксации ваших изменений. Это потребует некоторого обучения и тренировки.

2
ответ дан 27 November 2019 в 06:01
поделиться

Вы можете использовать ловушку перед фиксацией. В ловушке используйте svnlook author , чтобы узнать, вносите ли изменения изменения вы. В таком случае используйте svnlook changed , чтобы узнать, не меняете ли вы один из запрещенных файлов.

0
ответ дан 27 November 2019 в 06:01
поделиться

Я понимаю вашу проблему; возможно, этот «запрещенный» файл содержит параметры конфигурации и тому подобное, относящиеся только к вашей локальной среде сборки. Я не нашел способа напрямую указать SVN игнорировать изменения в версионном файле, но вот обходной путь, который я использовал в прошлом.

Предположим, ваш файл называется, скажем, "build.conf". Назовите файл с версией SVN как-то вроде build.conf.example. Затем вы можете автоматически скопировать build.conf.example в реальный build.conf, который останется неверсированным в вашем Makefile или скрипте сборки, или в чем-то еще. Затем вы svn игнорируете build.conf, и каждый разработчик может внести в него любые локальные изменения.

Но «должен быть способ лучше» ...

Edit: Здесь почти идентичный вопрос: SVN: Есть ли способ пометить файл как «не фиксировать»?

8
ответ дан 27 November 2019 в 06:01
поделиться

Говоря о Tortoisesvn и списках изменений, в нем уже есть список изменений под названием ignore-on-commit, который делает то, что вы ищете.

4
ответ дан 27 November 2019 в 06:01
поделиться

По моему опыту: не помещайте этот файл в систему контроля версий и используйте svn: ignore для него.

Вначале это немного сложно, так как вы не можете игнорировать файл который уже находится под контролем версий, и вы не можете удалить файл из системы контроля версий, не удалив его с жесткого диска (и из каждой рабочей копии при следующем обновлении ...). Но когда вам, наконец, удастся правильно настроить репо, это работает как шарм. Не забудьте добавить шаблон generic вместо исходного файла конфигурации (чтобы все знали о новых переменных конфигурации и т. Д.).

Для нового репо:

mkdir config
svn add config
svn propset svn:ignore '*.conf' config 

Для существующего репо: обязательно, чтобы иметь резервную копию вашей конфигурации в каждой рабочей копии, затем удалить (svn del) config из репо, зафиксировать (обратите внимание: файл будет удален из каждой рабочей копии при следующем обновлении! у вас должна быть резервная копия), а затем восстановить файл и установите свойство игнорирования.

Другой способ - блокировка. Это гарантирует, что никто не зафиксирует файл, но это приведет к ошибке при каждой фиксации. не очень красиво.

И третий способ - ревизии, новая функция в клиентах SVN 1.5. Это удобно, но это относится только к одной рабочей копии, а не к глобальному репозиторию. И вам придется настраивать их вручную, добавлять каждый новый файл - это сложно поддерживать.

3
ответ дан 27 November 2019 в 06:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: